Динамический метод LINQ для возврата списка различных элементов из двух списков - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу написать динамическую функцию LINQ для возврата различий между двумя списками, но абстрагированным способом заставить эту функцию взять любые два списка одного и того же типа и вернуть элементы, которые являются первым списком, но не во втором

Я пишу что-то похожее на приведенное ниже, и оно работает нормально, но, как я уже упоминал выше, оно мне нужно в абстракции

List<Employee> a  = List of Items; 
List<Employee> b  = List of Items;
var finalCountries = a.Where(u => !b.Any(u2 => u2.ISOA2 == u.ISOA2)).ToList();

Я читал о динамическом выражении LINQ, но это сложно, и у меня нетудача найти то, что я ищу

, если есть какой-либо способ записать приведенный выше оператор where в виде строки и выполнить его?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать Enumerable. Кроме этого

List<Employee> a; 
List<Employee> b;
var finalCountries = a.Except(b).ToList();

Если вам нужно сравнить ваших сотрудников по каким-то полям, и это не реализовано сотрудником, вы можете использовать пользовательский компаратор. Например это . Когда ваш код может выглядеть так:

var comparer = new LambdaComparer<Employee>((emp1,emp2)=>emp1.ISOA2 == emp2.ISOA2);
var finalCountries = a.Except(b,comparer).ToList();

LambdaComparer код для удобства:

class LambdaComparer<T> : IEqualityComparer<T>
{
    readonly Func<T, T, bool> _lambdaComparer;
    readonly Func<T, int> _lambdaHash;

    public LambdaComparer(Func<T, T, bool> lambdaComparer) :
        this(lambdaComparer, o => 0){}

    public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
    {
        _lambdaComparer = lambdaComparer ?? throw new ArgumentNullException(nameof(lambdaComparer));
        _lambdaHash = lambdaHash ?? throw new ArgumentNullException(nameof(lambdaHash));
    }

    public bool Equals(T x, T y) => _lambdaComparer(x, y);
    public int GetHashCode(T obj) => _lambdaHash(obj);
}

Обновление:

Чтобы сделать ваш метод универсальным, вы можете реализовать IEquatable интерфейс в каждом из ваших типов сущностей и использовать перегрузку Except без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...