如何在列表<>中找到重复的项目?
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
试试这个
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList();
这是[@Sachin的答案](http://stackoverflow.com/a/15866810/200449)的第一个版本不正确,请参阅对它的评论和编辑 – 2013-04-13 11:13:36
这对我来说是最好的选择。我错过了我的问题中的一点:如果我有{a,a,a,b,b,r},那么在输出处我应该得到{a,a,b} – Alex 2013-04-15 09:24:31
:
var dups = list.GroupBy(s => s)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
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();
这更易于理解,谢谢 – 2014-05-16 13:56:42
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
这将是更有效的,然后使用Where(g => g.Count() > 1)
的一个并且将只返回每个组中的一个元素。
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" }
+ 1可能是最有效的方法。 – 2013-04-07 20:23:04
看一下'GroupBy'方法。 – Oded 2013-04-07 19:29:39
完全预期的行为。除了()除了test_list列表中的所有条目外。你想做什么? – Tommi 2013-04-07 19:30:17
[如何从列表中使用LINQ获取重复项目](http://stackoverflow.com/questions/3811464/how-to-get-duplicate-items-from-a-list-using-linq) – 2013-04-07 19:34:52