如何使用LINQ从数组中删除重复项

4

我是C#的初学者,有一个问题想请教,我的数据库中有很多名字,我的问题是如何编写脚本来显示没有重复的姓名数据,使用LINQ?

这是一个例子:

string[] names = {hello, hello, stack, stack, overflow, overflow};

我不知道怎么做,能否有人写一个简单的脚本来展示它的实现方式。我可以自己解决剩下的部分。

5个回答

10

这是你要的:

string[] names = {"hello", "hello", "stack", "stack", "overflow", "overflow"};  
var distinctNames = names.Distinct();

foreach(String distinctName in distinctNames) 
    Console.WriteLine(distinctName);

7
我认为这个也应该可以工作。
names.Distinct().ToList().ForEach( n => Console.WriteLine(n));

不要认为你需要使用.ToList() - Fabian Tamp
@FabianTamp:我在LinqPad上测试了一下,没有使用ToList()。它显示“'System.Collections.Generic.IEnumerable<string>'不包含定义为'ForEach'的方法,也找不到接受类型为'System.Collections.Generic.IEnumerable<string>'的第一个参数的扩展方法'ForEach'”。 - Kaf
1
ForEach() 方法适用于 List<T>,而不是 IEnumerable<T>,因此如果要使用 ForEach 方法,则需要 .ToList()。或者,您可以像平常一样编写 foreach(){} 循环。 - Colin Mackay
嗨@Kaf,您能否指导我在删除重复值后如何对您分享的上述代码中的数据进行排序? - Omi

2
您可以使用Distinct
尝试这个:
string[] names = {"hello", "hello", "stack", "stack", "overflow", "overflow"};
var uniqueNames = (from c in names select c).Distinct();
foreach(String s in uniqueNames) Console.WriteLine(uniqueNames);

2
尽管有些答案被标记为已接受,但我认为我可以添加一些关于在数组中有对象且需要基于该对象的某个属性进行区分时可能遇到的意外问题的重要信息。
在这种情况下,LINQ的Distinct()函数可能无法正常工作,因此您应该使用类似于以下的解决方法(它会给您相同的结果):
var elems = someArray.GroupBy(x => x.PropertyToCompare).Select(y => y.First());

您可以在这里阅读更多内容:http://blog.jordanterrell.com/post/LINQ-Distinct()-does-not-work-as-expected.aspx


0
var duplicates = suppliers_arr
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key); 
if(duplicates.Count() > 0){
    foreach (var d in duplicates)
    {
        ModelState.AddFormError(string.Format("{0} is duplicated",d.ToString()));
    }
}else{
     //no duplicates
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接