检查列表是否有要排除的可选单词的重复

我有一个方法如下。 当列表包含重复项时,方法返回false / true。 我想扩展我的方法,例如(可选)我想从检查中排除特定项目。 例如,我想检查现在的整个列表,或者我想说例如exclude:string.empty items或者例如string.empty和“some word”。 可能吗?

public static bool IsListContainsDuplicates(List list) { return list.GroupBy(n => n).Any(c => c.Count() > 1); } 

 public static bool ContainsDuplicates(this IEnumerable items, IEnumerable itemsToExclude = null) { if (itemsToExclude == null) itemsToExclude = Enumerable.Empty(); return items.Except(itemsToExclude) .GroupBy(n => n) .Any(c => c.Count() > 1); } 

但我更喜欢这种实现方式,因为它的性能更高:

 public static bool ContainsDuplicates(this IEnumerable items, IEnumerable itemsToExclude = null) { if (itemsToExclude == null) itemsToExclude = Enumerable.Empty(); HashSet set = new HashSet(); return !items.Except(itemsToExclude).All(set.Add); } 

不要让你的方法更复杂,你应该更多地打开它以将它与其他人结合起来:

 public static class MyLinqMethods { public static bool HasDuplicates(this IEnumerable sequence) { return sequence.GroupBy(n => n).Any(c => c.Count() > 1); } } 

现在您可以将它与Linq一起使用:

 var original = new[] { string.Empty, "Hello", "World", string.Empty }; var duplicatesInOriginal = original.HasDuplicates(); var duplicatesIfStringEmptyIsIgnored = original.Where(o => o != string.Empty).HasDuplicates(); 

您可以使用Except() 。 来自MSDN:

通过使用默认的相等比较器来比较值,生成两个序列的集合差异。

 return list.Except(listToExclude).GroupBy(n => n).Any(c => c.Count() > 1); 

这也有帮助,在参数中使用’params’然后执行Except()

  public static bool IsListContainsDuplicates(List list, params T[] optional) { return list.Except(optional).GroupBy(n => n).Any(c => c.Count() > 1); } 

如果您不想排除任何内容,可以这样调用:

 IsListContainsDuplicates(list) 

否则,只需传递params值,例如,如果列表是整数列表,那么,

 IsListContainsDuplicates(list,5,4)