gpt4 book ai didi

linq - 检查对象列表中的重复项 C#

转载 作者:行者123 更新时间:2023-12-02 18:02:26 27 4
gpt4 key购买 nike

我正在寻找一种非常快速的方法来检查对象列表中的重复项。

我正在考虑简单地循环遍历列表并以这种方式进行手动比较,但我认为 linq 可能会提供更优雅的解决方案......

假设我有一个对象...

public class dupeCheckee
{
public string checkThis { get; set; }
public string checkThat { get; set; }

dupeCheckee(string val, string val2)
{
checkThis = val;
checkThat = val2;
}
}

我有这些对象的列表

List<dupeCheckee> dupList = new List<dupeCheckee>();
dupList.Add(new dupeCheckee("test1", "value1"));
dupList.Add(new dupeCheckee("test2", "value1"));
dupList.Add(new dupeCheckee("test3", "value1"));
dupList.Add(new dupeCheckee("test1", "value1"));//dupe
dupList.Add(new dupeCheckee("test2", "value1"));//dupe...
dupList.Add(new dupeCheckee("test4", "value1"));
dupList.Add(new dupeCheckee("test5", "value1"));
dupList.Add(new dupeCheckee("test1", "value2"));//not dupe

我需要找到该列表中的受骗者。当我找到它时,我需要做一些额外的逻辑不一定要删除它们。

当我使用 linq 时,我的 GroupBy 抛出异常......

'System.Collections.Generic.List<dupeCheckee>' does not contain a definition for 'GroupBy' and no extension method 'GroupBy' accepting a first argument of type 'System.Collections.Generic.List<dupeCheckee>' could be found (are you missing a using directive or an assembly reference?)

这告诉我我缺少一个图书馆。但我很难弄清楚是哪一个。

一旦我弄清楚了,我将如何基本上检查这两个条件......IE checkThis 和 checkThat 都出现多次?

更新:我的想法

这是我在快速研究后提出的 linq 查询...

test.Count != test.Select(c => new { c.checkThat, c.checkThis }).Distinct().Count()

我不确定这是否绝对比这个答案更好......

var duplicates = test.GroupBy(x => new {x.checkThis, x.checkThat})
.Where(x => x.Skip(1).Any());

我知道我可以将第一个语句放入 if else 子句中。我还进行了快速测试。当我期待 0 时,重复列表给了我 1,但它确实正确地调用了我使用的其中一个集合中有重复项的事实...

另一种方法完全符合我的预期。这是我用来测试这一点的数据集......

骗子:

List<DupeCheckee> test = new List<DupeCheckee>{ 
new DupeCheckee("test0", "test1"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test1", "test2"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test2", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test3", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test0", "test5"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test1", "test6"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test2", "test7"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test3", "test8"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test0", "test5"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test1", "test1"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test2", "test2"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test3", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test4", "test4"),//{ checkThis = "test", checkThat = "test1"}

};

没有骗子...

     List<DupeCheckee> test2 = new List<DupeCheckee>{ 
new DupeCheckee("test0", "test1"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test1", "test2"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test2", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test3", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test4", "test5"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test5", "test6"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test6", "test7"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test7", "test8"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test8", "test5"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test9", "test1"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test2", "test2"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test3", "test3"),//{ checkThis = "test", checkThat = "test1"}
new DupeCheckee("test4", "test4"),//{ checkThis = "test", checkThat = "test1"}

};

最佳答案

您需要引用 System.Linq(例如 using System.Linq)

那么你可以这样做

var dupes = dupList.GroupBy(x => new {x.checkThis, x.checkThat})
.Where(x => x.Skip(1).Any());

这将为您提供包含所有重复项的组

重复的测试将是

var hasDupes = dupList.GroupBy(x => new {x.checkThis, x.checkThat})
.Where(x => x.Skip(1).Any()).Any();

甚至调用 ToList()ToArray() 来强制计算结果,然后您就可以检查是否存在重复项。

例如..

var dupes = dupList.GroupBy(x => new {x.checkThis, x.checkThat})
.Where(x => x.Skip(1).Any()).ToArray();
if (dupes.Any()) {
foreach (var dupeList in dupes) {
Console.WriteLine(string.Format("checkThis={0},checkThat={1} has {2} duplicates",
dupList.Key.checkThis,
dupList.Key.checkThat,
dupList.Count() - 1));
}

}

或者

var dupes = dupList.Select((x, i) => new { index = i, value = x})
.GroupBy(x => new {x.value.checkThis, x.value.checkThat})
.Where(x => x.Skip(1).Any());

这为您提供了组,每个组中的每个项目将原始索引存储在属性index中,并将项目存储在属性value

关于linq - 检查对象列表中的重复项 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com