【问题标题】:Remove duplicate from the following list using Linq [closed]使用 Linq 从以下列表中删除重复项 [关闭]
【发布时间】:2013-08-26 20:08:14
【问题描述】:

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

【问题讨论】:

标签: c# linq


【解决方案1】:

由于您没有标记 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());

【讨论】:

    【解决方案2】:

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

    请检查类名(Items 应该是 Item)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以写一个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());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-08
          相关资源
          最近更新 更多