从List中删除具有重复属性的对象

时间:2012-04-03 12:23:26

标签: c# arrays

我在C#中有一个对象列表。所有对象都包含属性ID。 有几个对象具有相同的ID属性。

如何在每个ID属性只有一个对象的情况下修剪List(或创建一个新List)?

[从列表中删除任何其他重复项]

4 个答案:

答案 0 :(得分:88)

如果您想避免使用第三方库,可以执行以下操作:

fooArray.GroupBy(x => x.Id).Select(x => x.First());

这将按Id属性对数组进行分组,然后选择分组中的第一个条目。

答案 1 :(得分:17)

MoreLINQ DistinctBy()将完成这项工作,它允许使用object proeprty来实现清晰度。不幸的是,LINQ Distinct()内置了不灵活的enoght。

var uniqueItems = allItems.DistinctBy(i => i.Id);

<强> DistinctBy()

  

返回给定源的所有不同元素,其中   “清晰度”是通过投影和默认的均衡来确定的   比较投影类型。

PS:向Jon Skeet致信与社区共享此库

答案 2 :(得分:5)

var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);

....
...
var distinctedList = list.DistinctBy(x => x.ID).ToList();
GitHub

More LINQ

或者,如果您出于某种原因不想使用外部dll,可以使用此Distinct重载:

public static IEnumerable<TSource> Distinct<TSource>(
    this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)

用法:

public class FooComparer : IEqualityComparer<Foo>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Foo x, Foo y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.ID == y.ID
    }
}



list.Distinct(new FooComparer());

答案 3 :(得分:5)

不确定是否有人仍在寻找其他方法来执行此操作。但我已经使用此代码根据匹配的ID号从User对象列表中删除重复项。

    private ArrayList RemoveSearchDuplicates(ArrayList SearchResults)
    {
        ArrayList TempList = new ArrayList();

        foreach (User u1 in SearchResults)
        {
            bool duplicatefound = false;
            foreach (User u2 in TempList)
                if (u1.ID == u2.ID)
                    duplicatefound = true;

            if (!duplicatefound)
                TempList.Add(u1);
        }
        return TempList;
    }

调用:SearchResults = RemoveSearchDuplicates(SearchResults);