如何从List <t>中删除项目?</t>

时间:2010-12-23 15:59:43

标签: c# list

我有一个项目列表。

问题是返回的项目(我无法控制)三次返回相同的项目。

因此,虽然列表中应该包含的实际内容是:

  1. A
  2. C
  3. 我得到了

    1. A
    2. C
    3. A
    4. C
    5. A
    6. C
    7. 如何干净利落地删除重复项?也许计算项目,除以3并删除从X到list.Count的任何内容?

5 个答案:

答案 0 :(得分:11)

最快,最简单的事情是删除项目但运行不同的查询

var distinctItems = list.Distinct();

如果您必须拥有列表,则可以随时将.ToList()附加到呼叫中。如果您必须继续使用相同的列表,那么您只需要迭代它并跟踪您已有的内容并删除任何重复项。

编辑:“但我正在上课”

如果您有一个给定类的列表,要使用Distinct,您需要(a)覆盖类中的EqualsGetHashCode,以便进行适当的相等比较。如果您无权访问源代码(或者只是因为某种原因不想覆盖这些方法),那么您可以(b)提供IEqualityComparer<YourClass>实现作为Distinct的参数方法。这也允许您指定EqualsGetHashCode实现,而无需修改实际类的源。

public class MyObjectComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject a, MyObject b)
    {
        // code to determine equality, usually based on one or more properties
    }

    public int GetHashCode(MyObject a)
    {
        // code to generate hash code, usually based on a property
    }
}

// ...

var distinctItems = myList.Distinct(new MyObjectComparer());

答案 1 :(得分:1)

如果你100%确定你收到了你需要的所有东西3次,那么只需

var newList = oldList.Take(oldList.Count / 3).ToList()

答案 2 :(得分:0)

Linq有一个Distinct()方法就是这样做的。如果您想完全避免重复,请将项目放在HashSet中。

答案 3 :(得分:0)

如果你正在使用C#3或以上:

var newList = dupList.Distinct().ToList();

如果没有,则对列表进行排序并执行以下操作:

var lastItem = null;
foreach( var item in dupList )
{
    if( item != lastItem )
    {
        newItems.Add(item);
    }

    lastItem = item;
}

答案 4 :(得分:0)

您只需创建一个新列表并向其中添加尚未存在的项目。