Фильтрация списков с помощью LINQ

20
задан chwarr 24 January 2017 в 03:43
поделиться

7 ответов

Взгляните на Кроме метод, который Вы используете как это:

var resultingList = 
    listOfOriginalItems.Except(listOfItemsToLeaveOut, equalityComparer)

Вы захотите использовать перегрузку, с которой я связался, который позволяет Вам указать пользовательский IEqualityComparer. Тем путем можно указать, как объекты соответствуют на основе составного ключа. (Если Вы уже переопределили, Равняется, тем не менее, Вам не должен быть нужен IEqualityComparer.)

Редактирование: , Так как кажется, что Вы используете два различных типов классов, вот иначе, который мог бы быть более простым. Принятие List<Person> названный persons и List<Exclusion> названный exclusions:

var exclusionKeys = 
        exclusions.Select(x => x.compositeKey);
var resultingPersons = 
        persons.Where(x => !exclusionKeys.Contains(x.compositeKey));

, Другими словами: Выберите из исключений просто ключи, затем выберите от людей, весь Человек возражает, что не делают , имеют любой из тех ключей.

33
ответ дан 29 November 2019 в 23:33
поделиться

Я просто использовал бы метод FindAll на классе Списка. т.е.:

List<Person> filteredResults = 
    people.FindAll(p => return !exclusions.Contains(p));

Не уверенный, если синтаксис будет точно соответствовать Вашим объектам, но я думаю, что Вы видите, куда я иду с этим.

5
ответ дан 29 November 2019 в 23:33
поделиться

Можно использовать "Кроме" дополнительного метода (см. http://msdn.microsoft.com/en-us/library/bb337804.aspx )

В коде

var difference = people.Except(exclusions);
2
ответ дан 29 November 2019 в 23:33
поделиться

Большое спасибо за это парни.

я mangaged для снижения этого к одной строке:

  var results = from p in People 
                where !(from e in exclusions 
                        select e.CompositeKey).Contains(p.CompositeKey) 
                select p;

Еще раз спасибо все.

4
ответ дан 29 November 2019 в 23:33
поделиться

Я не мог выяснить, как сделать это в чистом MS LINQ, таким образом, я записал свой собственный дополнительный метод, чтобы сделать это:

public static bool In<T>(this T objToCheck, params T[] values)
{
    if (values == null || values.Length == 0) 
    {
        return false; //early out
    }
    else
    {
        foreach (T t in values)
        {
            if (t.Equals(objToCheck))
                return true;   //RETURN found!
        }

        return false; //nothing found
    }
}
1
ответ дан 29 November 2019 в 23:33
поделиться

Я сделал бы что-то вроде этого, но я держал пари, что существует более простой путь. я думаю, что sql от linqtosql использовал бы выбор от человека, Где НЕ СУЩЕСТВУЮТ (выбор из Вашего списка исключения)

static class Program
{
    public class Person
    {
        public string Key { get; set; }
        public Person(string key)
        {
           Key = key;
        }
    }
    public class NotPerson
    {
        public string Key { get; set; }
        public NotPerson(string key)
        {
           Key = key;
        }
    }
    static void Main()
    {

       List<Person> persons = new List<Person>()
       { 
           new Person ("1"),
           new Person ("2"),
           new Person ("3"),
           new Person ("4")
       };

       List<NotPerson> notpersons = new List<NotPerson>()
       { 
           new NotPerson ("3"),
           new NotPerson ("4")
       };

       var filteredResults = from n in persons
                             where !notpersons.Any(y => n.Key == y.Key)
                             select n;

       foreach (var item in filteredResults)
       {
          Console.WriteLine(item.Key);
       }
    }
 }
0
ответ дан 29 November 2019 в 23:33
поделиться

Этот LINQ ниже генерирует SQL для левого внешнего объединения и затем возьмет все результаты, которые не находят соответствие в Вашем списке исключения.

List<Person> filteredResults =from p in people
        join e in exclusions on p.compositeKey equals e.compositeKey into temp
        from t in temp.DefaultIfEmpty()
        where t.compositeKey == null
        select p

сообщает мне, работает ли это!

0
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

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