从列表中使用LINQ
另一种方法是使用HashSet:
var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
如果要在副本列表中使用唯一值:
var myhash = new HashSet<int>();
var mylist = new List<int>(){1,1,2,2,3,3,3,4,4,4};
var duplicates = mylist.Where(item => !myhash.Add(item)).Distinct().ToList();
下面是与通用扩展方法相同的解决方案:
public static class Extensions
{
public static IEnumerable<TSource> GetDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IEqualityComparer<TKey> comparer)
{
var hash = new HashSet<TKey>(comparer);
return source.Where(item => !hash.Add(selector(item))).ToList();
}
public static IEnumerable<TSource> GetDuplicates<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
return source.GetDuplicates(x => x, comparer);
}
public static IEnumerable<TSource> GetDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
return source.GetDuplicates(selector, null);
}
public static IEnumerable<TSource> GetDuplicates<TSource>(this IEnumerable<TSource> source)
{
return source.GetDuplicates(x => x, null);
}
}
找出枚举是否包含任何重复:
var anyDuplicate = enumerable.GroupBy(x => x.Key).Any(g => g.Count() > 1);
了解枚举中的所有值是否唯一:
var allUnique = enumerable.GroupBy(x => x.Key).All(g => g.Count() == 1);
解决此问题的最简单方法是根据元素的值对其进行分组,然后如果组中有多个元素,则选择该组的代表。在LINQ中,这转化为:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
如果要知道元素重复了多少次,可以使用:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
这将返回一个匿名类型的列表
,每个元素都有属性元素
和计数器
,以检索所需的信息。
最后,如果你要找的是字典,你可以用
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
这将返回一个字典,元素作为键,重复的次数作为值。
我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。
我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。
问题内容: 我有一个人员,我想查找重复的条目,以约束除以外的所有字段。因此,请使用-method(并因此使用),因为它们已考虑在内。 修改和方法以忽略该字段不是一种选择,因为代码的其他部分依赖于此。 如果我想忽略该字段,Java中最有效的方法是对重复项进行分类? 问题答案: 构建一个以实现您的自然键排序,然后使用基于二进制搜索的重复数据删除。即可为您提供这种能力。 请注意,必须满足通常的反对称性,
//想象所有字段的getter和setter。 我用上面的方法来测试Menuplan是否已经分配了给定的食谱(作为点心或食谱)。 我想知道是否有更优雅/更短的方法来编写函数。
问题内容: 在一个字段中查找重复项很容易: 所以如果我们有一张桌子 该查询将为我们提供John,Sam,Tom,Tom,因为它们都相同。 但是,我想要的是获取具有 和的 重复项。 也就是说,我想获得“ Tom”,“ Tom”。 我需要这个的原因:我犯了一个错误,并允许插入重复项和值。现在,我需要删除/更改重复项,因此我需要先 找到 它们。 问题答案: SELECT name, email, COU
我试着解决这个数组列表问题,但没有成功 无论如何,在while循环中,我必须向ArrayList添加新的字符串项。 如果有一个重复的项目,应该有一个消息说重复的项目。 While循环将按单词结束中断