2013-08-26 75 views
-1

我有一个具有属性的项目(Id,Name,DrugCode1,DrugCode2)。使用Linq从以下列表中删除重复项

项目列表中填充了重复的项目。

对于如:

------------------------------------------ 
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个itmes被视为重复因为DrugCode1和DrugCode2是相反的。 我们只需要获取一个项目。

如何使用linq删除列表中的重复项?

+0

可能重复[如何使用LINQ鲜明的()具有多个字段(HTTP ://stackoverflow.com/questions/10719928/how-to-use-linq-distinct-with-multiple-fields) –

+3

LINQ to _what_? –

+1

'Item3'呢?它也出现两次,代码为“4,3”和“3,4”...... – Shaamaan

回答

0

Enumerable.Distinct有一个超载,需要自定义IEqualityComparer参数。如果他们的药物代码以任意顺序匹配,则传递一个将两个项目对等的函数。

3

由于您没有标记linq供应商我假设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()); 
3

LINQ鲜明录取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表达式长,但它的清洁,简单,重新可用。

请检查类名(项目应项目)。

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());