Как проверить, являются ли два Выражения <Func <T, bool>> тем же [дубликат]

Вы не можете объединять подобные строки в агрегации mongoDB, вам нужно объединять строки с помощью оператора concat, поэтому функция createImageURL должна выглядеть примерно так,

module.exports.createImageURL = function ImageURL(){
    return { $concat: [ "https://myhostingservice.com/", "$video_id", "/preview_image" ] };
};
44
задан Abel 23 March 2011 в 15:08
поделиться

3 ответа

Можно взглянуть на тип ExpressionEqualityComparer , который используется в Linq к db4o. Это реализует интерфейс IEqualityComparer< T> таким образом, это применимо для универсальных наборов, а также для автономного использования.

Это использует тип ExpressionComparison , чтобы сравнить два Выражения для равенства, и HashCodeCalculation, вычислить хэш-код из Выражения.

Все это включает посещение дерева выражений, таким образом, это может быть довольно дорогостоящим, если Вы неоднократно делаете это, но это может также быть довольно удобно.

код доступен под GPL или dOCL

, Например, вот Ваш тест:

using System;
using System.Linq.Expressions;

using Db4objects.Db4o.Linq.Expressions;

class Test {

    static void Main ()
    {
        Expression<Func<int, bool>> a = x => false;
        Expression<Func<int, bool>> b = x => false;
        Expression<Func<int, bool>> c = x => true;
        Expression<Func<int, bool>> d = x => x == 5;

        Func<Expression, Expression, bool> eq =
            ExpressionEqualityComparer.Instance.Equals;

        Console.WriteLine (eq (a, b));
        Console.WriteLine (eq (a, c));
        Console.WriteLine (eq (a, d));
    }
}

И это действительно печатает Правда, Ложь, Ложь.

34
ответ дан Mårten Wikström 26 November 2019 в 22:16
поделиться

Как ленивый ответ, можно проверить ToString() - он должен, по крайней мере, указать, где они явно отличаются (хотя он будет включать имя var там, так, чтобы должно было бы быть то же).

Для проверки эквивалентности точно... намного тяжелее - большая работа, по большому количеству различных типов узлов.

17
ответ дан Marc Gravell 26 November 2019 в 22:16
поделиться

Это ударяет меня, что это могло бы быть трудно сделать, кроме самого простого из случаев.

, Например:

var numbers1 = Enumerable.Range(1, 20);
Expression<Func<int, IEnumerable<int>>> a = x => numbers1;
var numbers2 = Enumerable.Range(1, 20);
Expression<Func<int, IEnumerable<int>>> b = x => numbers2;

Технически, они равны, но как это могло быть определено, не оценивая IEnuemrable, возвращенный в каждом выражении?

4
ответ дан Dustin Campbell 26 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: