使用Linq从以下列表中删除重复项

时间:2013-08-26 11:40:48

标签: c# linq

我有一个具有属性的项目(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删除列表中的重复项?

4 个答案:

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