【问题标题】:How to find duplicate ids from list in c# [closed]如何从 C# 中的列表中查找重复的 id [关闭]
【发布时间】:2016-05-09 16:25:13
【问题描述】:

我想使用 **linq 过滤列表中的重复 ID,代码如下:**

foreach (var item in _VMReturnStock.scmDistReturnDetails.ToList())
{ 

}

我在scmDistReturnDetails有ids,这种情况我该怎么办?并且在重复 id 的基础上,我必须将模型状态设置为 false。**

【问题讨论】:

标签: c# linq list foreach


【解决方案1】:
var list = _VMReturnStock.scmDistReturnDetails.Select(x=> x.ID).Distinct();

【讨论】:

  • 对于我的需要,这是这里最有用的答案,给我一个列表(或计数)减去重复的所有内容。
【解决方案2】:

您可以使用 Jon Skeet (Nuget) 的 MoreLinq。

它提供了“DistinctBy”方法。

foreach (var item in _VMReturnStock.scmDistReturnDetails.DistinctBy(d=>d.Id).ToList())
        { 

        }

DistinctBy 检查 lambda 的返回值是否唯一,但它返回原始对象

【讨论】:

  • 我必须将该 id 存储在一个变量中,如果 id 计数 > 1,则我必须将模型状态设置为 false。我不需要不同的 ID
  • 我认为最初的问题是过滤掉具有重复 id 的记录...? “将模型状态设置为 false”是什么意思?
  • yes 过滤掉重复的 id,如果列表中有任何重复的 id,我必须将模型状态设置为 false,这样用户就无法保存数据
【解决方案3】:

如果你想用现有的 LINQ 运算符实现一个解决方案,一个解决方案是 GroupBy ID,然后选择每个组的第一个元素。如果数据源是 LINQ 提供程序,那么繁重的工作很可能会在服务器端完成。

foreach (var item in _VMReturnStock.scmDistReturnDetails.GroupBy(d=>d.Id).Select(grp=>grp.First()).ToList())
    { 

    }

【讨论】:

【解决方案4】:

我想你的 ID 是 int 并且 ModelState 默认值是 true 所以你可以这样做

        int? uniqueID = _VMReturnStock.scmDistReturnDetails.FirstOrDefault();

        foreach (var item in _VMReturnStock.scmDistReturnDetails.ToList())
        {
            if (item != tmp)
            {
                _VMReturnStock.ModelState = false;
                uniqueID = null;
                break;
            }
        }

如果您的 ID 不明确,则模型状态将设置为 false 并且 uniqueID(您将返回 r 存储在某个位置)将没有值。

【讨论】:

    【解决方案5】:

    您的问题根本不清楚,“将模型状态设置为 false”是一个谜,但基于您的一个 cmets,我认为您想做这样的事情。

            foreach (var item in scmDistReturnDetails.GroupBy(x=>x.id))
            {
               if (item.Count() > 0) 
                 {
                   //add item.Key, the ID, into a variable where you can "set model state false"
                 }
            }
    

    【讨论】:

      【解决方案6】:

      试试这个:

      List<int> list = new List<int>() { 1, 2, 5, 3, 1, 2, 3, 4, 5, 6 };
      
                  var info = list.GroupBy(i => i).ToDictionary(i => i.Key, i => i.Count());
      
                  foreach (var k in info.Where(k => k.Value > 1))
                      Console.WriteLine(k.Key);
      

      【讨论】:

      • 虽然这可行,但如果您有大量没有重复的记录,则效率低下。您将从数据源中提取所有记录,即使它们没有任何重复项。请参阅我的答案以获得更好的方法。
      【解决方案7】:
      List<int> list = new List<int>() { 1, 2, 5, 3, 1, 2, 3, 4, 5, 6 };
      
      var dups = list.GroupBy(i => i).Where(i=>i.Count()>1).Select(i=>i.Key);
      
      foreach (var k in dups)
        Console.WriteLine(k.Key);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-20
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多