我有:
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()删除了所有元素。
你能帮我解决一下吗?
答案 0 :(得分: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();
答案 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 :(得分:9)
试试这个
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
答案 3 :(得分:3)
一种简单的方法是使用Enumerable.GroupBy
:
var dups = list.GroupBy(s => s)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
答案 4 :(得分:0)
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList();
答案 5 :(得分:0)
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
它比使用Where(g => g.Count() > 1)
的效率更高,并且每组只返回一个元素。