C# 检查表<;T>;对于包含要排除的可选单词的重复

C# 检查表<;T>;对于包含要排除的可选单词的重复,c#,C#,我有一个方法如下。方法在列表是否包含重复项时返回false/true。我想扩展我的方法,比如说(可选)我想从检查中排除特定的项目。例如,我想按现在的样子检查整个列表,或者我想说例如exclude:string.empty items或例如string.empty和“some word”。可能吗 public static bool IsListContainsDuplicates<T>(List<T> list) { return list.GroupBy(n =

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

public static bool IsListContainsDuplicates<T>(List<T> list)
{
    return list.GroupBy(n => n).Any(c => c.Count() > 1);
}
public static bool islists包含多个副本(列表)
{
return list.GroupBy(n=>n).Any(c=>c.Count()>1);
}
公共静态bool包含多个副本(此IEnumerable items,IEnumerable itemsToExclude=null)
{
如果(itemsToExclude==null)itemsToExclude=Enumerable.Empty();
返回项目。除(itemsToExclude)
.GroupBy(n=>n)
.Any(c=>c.Count()>1);
}
但我更喜欢这种实现,因为它更具性能:

public static bool ContainsDuplicates<T>(this IEnumerable<T> items, IEnumerable<T> itemsToExclude = null)
{
    if (itemsToExclude == null) itemsToExclude = Enumerable.Empty<T>();
    HashSet<T> set = new HashSet<T>();
    return !items.Except(itemsToExclude).All(set.Add);
}
public static bool包含多个副本(此IEnumerable items,IEnumerable itemsToExclude=null)
{
如果(itemsToExclude==null)itemsToExclude=Enumerable.Empty();
HashSet=newhashset();
return!items.Except(itemsToExclude).All(set.Add);
}
您可以使用
Except()
。从MSDN:

使用默认值生成两个序列的集合差 用于比较值的相等比较器


与其使您的方法变得更复杂,不如将其打开,以便与其他方法相结合:

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

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

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

IsListContainsDuplicates(list,5,4)

是的,这是可能的。所以当列表中包含两次
“某个单词”
时,它应该作为副本返回吗?除此之外:为什么您的方法在实际处理字符串列表时是泛型的?问题:1)除了列表之外,它还处理数组吗?2) 如果我想排除empty,我应该像传递“”?是的,它适用于实现
IEnumerable
的每一种类型,也适用于列表或数组。如果
T
是一种自定义类型,则需要覆盖
Equals
+
GetHashCode
或为
包含副本的
提供
IEqualityComparer
(该重载尚未丢失)。太好了。只是把这个关键字放在两个参数之前,让它成为一个足够的扩展方法吗?@DinoDin2:这个方法必须是静态的,
这个
必须在第一个参数之前,并且这个方法必须在一个静态类(扩展类)中。@DinoDin2:为什么不试试?是的,这就是我可以排除更多项但将它们传递给方法本身的方法吗?是的,如果要使用
this
关键字使其成为扩展方法,那么它必须位于
静态类中。
public static class MyLinqMethods
{
  public static bool HasDuplicates<T>(this IEnumerable<T> sequence)
  {
      return sequence.GroupBy(n => n).Any(c => c.Count() > 1);
  }
}
var original = new[] { string.Empty, "Hello", "World", string.Empty };

var duplicatesInOriginal = original.HasDuplicates();

var duplicatesIfStringEmptyIsIgnored = original.Where(o => o != string.Empty).HasDuplicates();
  public static bool IsListContainsDuplicates<T>(List<T> list, params T[] optional)
        {
            return list.Except(optional).GroupBy(n => n).Any(c => c.Count() > 1);
        }
IsListContainsDuplicates(list)
IsListContainsDuplicates(list,5,4)