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() 删除了所有元素。

你能帮我解决吗?

4

6 回答 6

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();
于 2013-04-07T19:30:39.647 回答
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" }
于 2013-04-07T19:44:47.727 回答
8

试试这个

var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
于 2013-04-07T19:29:49.647 回答
3

一个简单的方法是使用Enumerable.GroupBy

var dups = list.GroupBy(s => s)
               .Where(g => g.Count() > 1)
               .Select(g => g.Key);
于 2013-04-07T19:30:33.723 回答
0
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList();
于 2013-04-07T19:29:59.167 回答
0
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();

它会比使用的更有效,Where(g => g.Count() > 1)并且每个组只返回一个元素。

于 2013-04-07T19:41:20.150 回答