检查列表是否有要排除的可选单词的重复
我有一个方法如下。 当列表包含重复项时,方法返回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)