LINQ's Distinct() on a particular property

后端 未结 20 2031
一向
一向 2020-11-21 05:05

I am playing with LINQ to learn about it, but I can\'t figure out how to use Distinct when I do not have a simple list (a simple list of integers is pretty easy

20条回答
  •  孤街浪徒
    2020-11-21 05:34

    EDIT: This is now part of MoreLINQ.

    What you need is a "distinct-by" effectively. I don't believe it's part of LINQ as it stands, although it's fairly easy to write:

    public static IEnumerable DistinctBy
        (this IEnumerable source, Func keySelector)
    {
        HashSet seenKeys = new HashSet();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
    

    So to find the distinct values using just the Id property, you could use:

    var query = people.DistinctBy(p => p.Id);
    

    And to use multiple properties, you can use anonymous types, which implement equality appropriately:

    var query = people.DistinctBy(p => new { p.Id, p.Name });
    

    Untested, but it should work (and it now at least compiles).

    It assumes the default comparer for the keys though - if you want to pass in an equality comparer, just pass it on to the HashSet constructor.

提交回复
热议问题