Filtering lists using LINQ

前端 未结 9 2054
暖寄归人
暖寄归人 2021-02-04 00:23

I\'ve got a list of People that are returned from an external app and I\'m creating an exclusion list in my local app to give me the option of manually removing people from the

相关标签:
9条回答
  • 2021-02-04 00:29

    You can use the "Except" extension method (see http://msdn.microsoft.com/en-us/library/bb337804.aspx)

    In your code

    var difference = people.Except(exclusions);
    
    0 讨论(0)
  • 2021-02-04 00:32

    Have a look at the Except method, which you use like this:

    var resultingList = 
        listOfOriginalItems.Except(listOfItemsToLeaveOut, equalityComparer)
    

    You'll want to use the overload I've linked to, which lets you specify a custom IEqualityComparer. That way you can specify how items match based on your composite key. (If you've already overridden Equals, though, you shouldn't need the IEqualityComparer.)

    Edit: Since it appears you're using two different types of classes, here's another way that might be simpler. Assuming a List<Person> called persons and a List<Exclusion> called exclusions:

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

    In other words: Select from exclusions just the keys, then pick from persons all the Person objects that don't have any of those keys.

    0 讨论(0)
  • 2021-02-04 00:32

    I would just use the FindAll method on the List class. i.e.:

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

    Not sure if the syntax will exactly match your objects, but I think you can see where I'm going with this.

    0 讨论(0)
  • 2021-02-04 00:37

    Many thanks for this guys.

    I mangaged to get this down to one line:

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

    Thanks again everyone.

    0 讨论(0)
  • 2021-02-04 00:37
    var thisList = new List<string>{ "a", "b", "c" };
    var otherList = new List<string> {"a", "b"};
    
    var theOnesThatDontMatch = thisList
            .Where(item=> otherList.All(otherItem=> item != otherItem))
            .ToList();
    
    var theOnesThatDoMatch = thisList
            .Where(item=> otherList.Any(otherItem=> item == otherItem))
            .ToList();
    
    Console.WriteLine("don't match: {0}", string.Join(",", theOnesThatDontMatch));
    Console.WriteLine("do match: {0}", string.Join(",", theOnesThatDoMatch));
    
    //Output:
    //don't match: c
    //do match: a,b
    

    Adapt the list types and lambdas accordingly, and you can filter out anything.

    https://dotnetfiddle.net/6bMCvN

    0 讨论(0)
  • 2021-02-04 00:40
                var result = Data.Where(x =>
                {
                bool condition = true;
                double accord = (double)x[Table.Columns.IndexOf(FiltercomboBox.Text)];
                return condition && accord >= double.Parse(FilterLowertextBox.Text) && accord <= double.Parse(FilterUppertextBox.Text); 
            });
    
    0 讨论(0)
提交回复
热议问题