/linq4c

LINQ for C(GroupBy, GroupJoin, Join, Take, Where, Select, etc)

Primary LanguageCMIT LicenseMIT

Linq for C

IMG1 IMG2

Features

  • Most of the LINQ methods(60+) are supported.
  • Chaining of LINQ methods are supported.
  • Lambda is supported(slow).

Examples

For more examples, please see the main.c file.

Example using callbacks

#include <gc.h>
#include "ArrayList.h"
#include "linq.h"

bool WhereCallback(void *item) {
    char *str= (char *)item;
    return str[0] == 'h';
}

void *SelectCallback(void *item) {
    return newStr("%s_1", (char *)item);
}

ArrayList testLinq(ArrayList array) {
    Linq *lq = From(array);

    ArrayList result =
        lq
        ->Where(lq, WhereCallback)
        ->Select(lq, SelectCallback)
        ->ToArray(lq);

    return result;
}

int main() {
    GC_INIT();

    char *str1 = "huang", *str2 = "hai", *str3 = "feng";

    ArrayList array = arrlist_new();
    arrlist_append(array, str1);
    arrlist_append(array, str2);
    arrlist_append(array, str3);

    ArrayList result = testLinq(array);
    for(int i = 0; i < arrlist_size(result); i++) {
        printf("%s\n", arrlist_get(result, i));
    }

    return 0;
}

Example with lambdas

ArrayList testLinq(ArrayList array) {
    Linq *lq = From(array);

    ArrayList result =
        lq
        ->Where(lq,
                lambda(bool, (void *item) {
                    char *str= (char *)item;
                    return str[0] == 'h';
                }))
        ->Select(lq,
                 lambda(void *, (void *item) {
                     return newStr("%s_1", (char *)item);
                 }))
        ->ToArray(lq);

    return result;
}

int main() {
    GC_INIT();

    char *str1 = "huang", *str2 = "hai", *str3 = "feng";

    ArrayList array = arrlist_new();
    arrlist_append(array, str1);
    arrlist_append(array, str2);
    arrlist_append(array, str3);

    ArrayList result = testLinq(array);
    for(int i = 0; i < arrlist_size(result); i++) {
        printf("%s\n", arrlist_get(result, i));
    }

    return 0;
}

Example with macros

#define LINQ_PTR lq

bool WhereCallback(void *item) {
    char *str= (char *)item;
    return str[0] == 'h';
}

void *SelectCallback(void *item) {
    return newStr("%s_1", (char *)item);
}

ArrayList testLinq(ArrayList array) {
    Linq *lq = From(array);

    ArrayList result =
        lq
        ->WHERE(WhereCallback)
        ->SELECT(SelectCallback)
        ->TO_ARRAY();

    return result;
}

int main(int argc, char **argv) {
    GC_INIT();

    char *str1 = "huang", *str2 = "hai", *str3 = "feng";

    ArrayList array = arrlist_new();
    arrlist_append(array, str1);
    arrlist_append(array, str2);
    arrlist_append(array, str3);

    ArrayList result = testLinq(array);
    for(int i = 0; i < arrlist_size(result); i++) {
        printf("%s\n", arrlist_get(result, i));
    }

    return 0;
}

Requirement

As for the garbage collect, you need to install Boehm GC.

# yum install gc-devel      # RedHat family
# apt-get install libgc-dev # Debian family

What's implemented


  • Where
  • WhereIndexed
  • Select
  • SelectIndexed
  • SelectMany
  • SelectManyIndexed
  • SelectManyBy
  • FirstOrDefault
  • LastOrDefault
  • Take
  • TakeEvery
  • TakeWhile
  • TakeWhileIndexed
  • TakeExceptLast
  • TakeFromLast
  • Skip
  • SkipWhile
  • SkipWhileIndexed
  • Any
  • All
  • Reverse
  • IndexOf
  • LastIndexOf
  • Concat
  • Except
  • Union
  • Intersect
  • SumInts
  • SumFloats
  • MaxInts
  • MaxFloats
  • MinInts
  • MinFloats
  • AverageInts
  • AverageFloats
  • Max
  • Min
  • OrderBy
  • OrderByDesc
  • GroupBy
  • Zip
  • Single
  • SingleWith
  • Contains
  • Count
  • CountWith
  • JoinStr
  • Join
  • GroupJoin
  • Aggregate
  • AggregateWithSeed
  • AggregateWithSeedBy
  • SequenceEqual
  • Prepend
  • Append
  • ForEach
  • AlternateBefore
  • AlternateAfter
  • Shuffle
  • Slice
  • Pad
  • PadBy
  • Print
  • Println

License

MIT