我有一个具有属性的项目(Id,Name,DrugCode1,DrugCode2)。
项目清单中填充了重复的项目。
例如:
------------------------------------------
Id Name DrugCode1 DrugCode2
------------------------------------------
1 Item1 2 3
2 Item2 3 2
3 Item3 4 3
1 Item1 3 2
3 Item3 3 4
如果DurgCode1和DrugCode2被颠倒,那么我们认为这些项目是重复的
例如:
1 Item1 2 3
1 Item1 3 2
以上2个主题被认为是重复的,因为DrugCode1和DrugCode2是相反的。 我们只需要获取一个项目。
如何使用linq删除列表中的重复项?
答案 0 :(得分:3)
由于您没有标记linq-provider我假设Linq-To-Objects
。您可以使用GroupBy
的相同顺序的匿名类型:
IEnumerable<Item> distinctItems = items
.GroupBy(i => new { Min=Math.Min(i.DrugCode1, i.DrugCode2),Max=Math.Max(i.DrugCode1, i.DrugCode2) })
.Select(g => g.First());
答案 1 :(得分:3)
LINQ Distinct允许IEqualityComparer<T>
作为参数。选择这种方式,您可以像这样实现自己的IEqualityComparer:
class ItemEqualityComparer : IEqualityComparer<Item>
{
public bool Equals(Item i1, Item i2)
{
if (i1.ID == i2.ID && i1.Name == i2.Name &&
(i1.DrugCode1 == i2.DrugCode1 || i1.DrugCode1 == i2.DrugCode2 ||
i1.DrugCode2 == i2.DrugCode1 ))
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(Item obj)
{
int hash = 13;
int min = Math.Min(obj.DrugCode1, obj.DrugCode2);
int max = Math.Max(obj.DrugCode1, obj.DrugCode2);
hash = (hash * 7) + min;
hash = (hash * 7) + max;
return hash;
}
}
现在你可以使用它了:
var cleanList = listOfItems.Distinct(new ItemEqualityComparer());
它比Lambda Expression有点长,但它干净,简单且可重复使用。
请检查班级名称(项目应为项目)。
答案 2 :(得分:0)
Enumerable.Distinct
有一个带有自定义IEqualityComparer
参数的重载。如果药物代码按任何顺序匹配,则传递一个将两个项目视为相等的函数。
答案 3 :(得分:0)
您可以撰写IEqaulityComparer
,然后将其与Distinct
class ItemEuqalityComprer : IEqualityComparer<Item>
{
public bool Equals(Item x, Item y)
{
return x.DrugCode1 == y.DrugCode2
&& x.DrugCode2 == y.DrugCode1;
}
public int GetHashCode(Item obj)
{
return obj.Id == null ? 0 : obj.Id.GetHashCode();
}
}
Distinct
的用法:
var item1 = new Item {DrugCode1 = "2", DrugCode2 = "3"};
var item2 = new Item {DrugCode1 = "3", DrugCode2 = "2"};
var item3 = new Item { DrugCode1 = "3", DrugCode2 = "4" };
var items = new[] {item1, item2, item3};
var distincts = items.Distinct(new ItemEuqalityComprer());