Хотя одномерный массив очень похож на указатель на элемент массива, многомерный массив не является указателем на указатель ... или массивом указателей. В памяти он организован как одномерный массив, единственное отличие состоит в том, что компилятор знает, как вычислить адрес из более чем одного индекса.
Ваш массив организован в памяти следующим образом
a000 a001 a002 a010 a011 a012 a020 a021 a022 a100 a101 a101 ...
, где a[0][0][0]
и т. Д. Записывается как a000
и т. Д. Для экономии места. Вы можете сделать
newMate(args[1])
, если определите newMate
для получения двумерного массива
struct MateMessage newMate(char cr[3][3]) {
int i,j;
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
doSomethingWith(cr[i][j]);
}
}
return something;
}
В этом случае функция, вызывающая, передаст адрес a[1][0][0]
в [ 117] и newMate
будут знать, как обратиться к оставшимся двум измерениям.
Проблема - то, что Выражение, Вы создаете в методе OrExpressions, снова использует орган по этим двум выражениям. Те тела будут содержать ссылки на свой собственный ParameterExpression, который был определен в FilterExpression.
Фиксация должна была бы переписать левые и правые части для использования нового ParameterExpression. Или провести исходный ParameterExpression. Именно, не потому что два ParameterExpression имеют то же имя, они представляют тот же параметр.
Как уже предложено, здесь можно найти этот очень хороший (рабочий) код
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
}
то, что можно адаптироваться к потребностям и который не связывается (по моему скромному мнению), с LINQ.
Я не уверен в надлежащих условиях здесь, но в основном параметры выражения не эквивалентны, даже если у них есть то же имя.
Это означает это
var param1 = Expression.Parameter(typeof(T), "item");
var param2 = Expression.Parameter(typeof(T), "item");
param1 != param2
param1 и param2 не будут тем же самым, если используется в выражении.
Лучший способ иметь дело с этим, создают один параметр впереди для Вашего выражения и затем передают его всем функциям помощника, для которых нужен параметр.
Править: Кроме того, при попытке динамично сочинить, где пункты в LINQ, Вы могли дать PredicateBuilder попытку.
Решение Фабрицио тоже пришло мне в голову, но, поскольку я пытался объединить два выражения, которые будут выполняться как sql-запрос linq 2, я подумал, что это будет выполнять в памяти, а не на сервере sql.
Мне писали: Linq-To-Sql распознает, что вызов является лямбда-выражением, и, таким образом, по-прежнему производит оптимизированный sql.