-1

我有一个具有属性(Id、Name、DrugCode1、DrugCode2)的类 Items。

项目列表填充有重复项目。

例如:

------------------------------------------
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

由于 DrugCode1 和 DrugCode2 颠倒,上述 2 个项目被认为是重复的。我们只需要获取一项。

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

4

4 回答 4

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());
于 2013-08-26T11:55:29.143 回答
3

LINQ Distinct 接受一个IEqualityComparer<T>as 参数。选择这种方式,您可以像这样实现自己的 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 表达式长一点,但它干净、简单且可重复使用。

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

于 2013-08-26T11:57:31.333 回答
0

Enumerable.Distinct有一个采用自定义IEqualityComparer参数的重载。传入一个函数,如果它们的药物代码以任一顺序匹配,则将两个项目视为相等。

于 2013-08-26T11:52:01.053 回答
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());
于 2013-08-26T11:59:52.830 回答