2013-04-07 80 views
7

我:如何在列表<>中找到重复的项目?

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 

我怎样才能得到只有 “A”, “B”?

我试着这样做:

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 
List<string> test_list = new List<string>(); 

test_list = list.Distinct().ToList(); 

现在test_list具有{ “A”, “B”, “R”, “T”}
然后:

test_list = test_list.Except(list).ToList(); 

所以这是我的失败点,因为Except()删除了所有元素。

你能帮我解决吗?一个简单的方法是使用Enumerable.GroupBy

+1

看一下'GroupBy'方法。 – Oded 2013-04-07 19:29:39

+0

完全预期的行为。除了()除了test_list列表中的所有条目外。你想做什么? – Tommi 2013-04-07 19:30:17

+0

[如何从列表中使用LINQ获取重复项目](http://stackoverflow.com/questions/3811464/how-to-get-duplicate-items-from-a-list-using-linq) – 2013-04-07 19:34:52

回答

9

试试这个

var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList(); 
+6

我不明白为什么这个答案是upvoted。任何人都用'{“a”,“a”,“b”,“b”,“a”,“r”,“t”}'来试用它? – I4V 2013-04-07 19:39:04

+0

你可以做到这一点。老实说,为了实现这个方法,我不得不考虑太长时间和很长时间。我更喜欢l4V的;更可读和更明确。编辑:也许它更快,但我怀疑这种情况下的表现完全是问题。 – 2013-04-07 19:43:38

+1

I4V,你是对的,它不能正常工作 – Alex 2013-04-07 19:44:18

0
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList(); 
+0

这是[@Sachin的答案](http://stackoverflow.com/a/15866810/200449)的第一个版本不正确,请参阅对它的评论和编辑 – 2013-04-13 11:13:36

+0

这对我来说是最好的选择。我错过了我的问题中的一点:如果我有{a,a,a,b,b,r},那么在输出处我应该得到{a,a,b} – Alex 2013-04-15 09:24:31

3

var dups = list.GroupBy(s => s) 
       .Where(g => g.Count() > 1) 
       .Select(g => g.Key); 
16
List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 

var dups = list.GroupBy(x => x) 
    .Where(x => x.Count() > 1) 
    .Select(x => x.Key) 
    .ToList(); 
+2

这更易于理解,谢谢 – 2014-05-16 13:56:42

0
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList(); 

这将是更有效的,然后使用Where(g => g.Count() > 1)的一个并且将只返回每个组中的一个元素。

10
var list = new List<string> { "a", "a", "b", "b", "r", "t" }; 

var distinct = new HashSet<string>();  
var duplicates = new HashSet<string>(); 

foreach (var s in list) 
    if (!distinct.Add(s)) 
     duplicates.Add(s); 

// distinct == { "a", "b", "r", "t" } 
// duplicates == { "a", "b" } 
+2

+ 1可能是最有效的方法。 – 2013-04-07 20:23:04

相关问题