我有一个项目列表。
问题是返回的项目(我无法控制)三次返回相同的项目。
因此,虽然列表中应该包含的实际内容是:
我得到了
如何干净利落地删除重复项?也许计算项目,除以3并删除从X到list.Count的任何内容?
答案 0 :(得分:11)
最快,最简单的事情是不删除项目但运行不同的查询
var distinctItems = list.Distinct();
如果您必须拥有列表,则可以随时将.ToList()
附加到呼叫中。如果您必须继续使用相同的列表,那么您只需要迭代它并跟踪您已有的内容并删除任何重复项。
编辑:“但我正在上课”
如果您有一个给定类的列表,要使用Distinct,您需要(a)覆盖类中的Equals
和GetHashCode
,以便进行适当的相等比较。如果您无权访问源代码(或者只是因为某种原因不想覆盖这些方法),那么您可以(b)提供IEqualityComparer<YourClass>
实现作为Distinct
的参数方法。这也允许您指定Equals
和GetHashCode
实现,而无需修改实际类的源。
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)
您只需创建一个新列表并向其中添加尚未存在的项目。