Если вы используете LINQ to SQL или LINQ to Entities, вы должны полностью полностью реализовать результаты в памяти:
var oddCategories = projectsByCat.ToList().Where((c,i) => i % 2 != 0);
var evenCategories = projectsByCat.ToList().Where((c,i) => i % 2 == 0);
Невозможно выполнить итерацию результатов в базе данных с помощью индексатора без использования курсора, который не работает либо с каркасом ORM.
Объявите указатели функции, добавьте их в свою структуру, а затем вызовите их, это просто C.
Пример:
//Typedef 2 function pointers, first takes and returns int,
// second takes and returns double
typedef int (*FuncPtrInt) (int);
typedef double (*FuncPtrDouble)(double);
// create structure to store function pointers
struct ABC
{
FuncPtrInt applyA;
FuncPtrDouble applyB;
};
// create some functions to use with structure
int incrFuncA(int num) { return ++num; }
double decrFuncB(double num) { return --num; }
double multiplyFuncB(double num) { return num*num; }
// try it out
void testStruct()
{
struct ABC abc;
abc.applyA = incrFuncA;
abc.applyB = decrFuncB;
NSLog(@"increment: %d",abc.applyA(3));
NSLog(@"decrement: %f",abc.applyB(3.5));
abc.applyB = multiplyFuncB;
NSLog(@"multiply: %f",abc.applyB(3.5));
}
Выход:
2010-02-01 10:36:22.335 x[11847] increment: 4
2010-02-01 10:36:22.336 x[11847] decrement: 2.500000
2010-02-01 10:36:22.336 x[11847] multiply: 12.250000
Если вы хотите иметь структуру с функциями, в которой функции работают на структуре, то по умолчанию вы должны передать указатель на эту функцию (аналогично тому, как это делает c++):
Определение:
struct ClassABC;
typedef int (*FuncPtrClassABC)(struct ClassABC *);
typedef int (*FuncPtrClassABCInt)(struct ClassABC *, int);
int incrFunc(struct ClassABC * abc);
int decrFunc(struct ClassABC * abc);
int addFunc(struct ClassABC * abc, int num);
int subtractFunc(struct ClassABC * abc, int num);
struct ClassABC
{
int i;
FuncPtrClassABC increment;
FuncPtrClassABC decrement;
FuncPtrClassABCInt add;
FuncPtrClassABCInt subtract;
};
Как вы видите, эти функции могут быть автономными, вы все равно передадите ClassABC в:
int incrFunc(struct ClassABC * abc) { return ++(abc->i); }
int decrFunc(struct ClassABC * abc) { return --(abc->i); }
int addFunc(struct ClassABC * abc, int num)
{ abc->i += num; return abc->i; }
int subtractFunc(struct ClassABC * abc, int num)
{ abc->i -= num; return abc->i; }
Функция помощника инициализации:
void initClassABC(struct ClassABC * abc)
{
abc->i = 0;
abc->increment = incrFunc;
abc->decrement = decrFunc;
abc->add = addFunc;
abc->subtract = subtractFunc;
}
Использование:
struct ClassABC cabc;
initClassABC(&cabc);
cabc.add(&cabc,4);
NSLog(@"add: %d", cabc.i);
cabc.decrement(&cabc);
NSLog(@"decrement: %d", cabc.i);
cabc.subtract(&cabc,2);
NSLog(@"subtract: %d", cabc.i);
Выход:
2010-02-01 10:56:39.569 x[12894] add: 4
2010-02-01 10:56:39.569 x[12894] decrement: 3
2010-02-01 10:56:39.569 x[12894] subtract: 1
Enjoy
.Цели-С - это правильный суперсет С. Все, что вы можете сделать в С, может быть сделано идентично в Цели-С. Таким образом, вам не нужно думать о них как о разных языках; Ц - это просто "С плюс еще кое-что".
// this struct is compatible with C and Obj-C
struct fruit {
int a;
};
int main()
{
struct fruit apple;
apple.a = 1;
return 0;
}
Тогда любой исходный файл C или Objective-C может получить доступ к этой структуре. Нет никаких дополнительных осложнений, введенных в Objective-C.