Lista di controllo per duplicazioni con parole facoltative da escludere

Ho un metodo come di seguito. Il metodo restituisce false / true quando l’elenco contiene duplicati o meno. Vorrei estendere il mio metodo per dire ad esempio (facoltativo) che voglio escludere determinati elementi dal controllo. Ad esempio voglio controllare l’intero elenco come è adesso o voglio dire ad esempio escludi: string.empty items o per esempio string.empty e “some word”. È ansible?

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); } 

Ma preferirei questa implementazione perché è più performante:

 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); } 

Invece di rendere il tuo metodo più complicato, dovresti aprirlo di più per combinarlo con gli altri:

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

Ora puoi usarlo con Linq:

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

Puoi usare l’ Except() . Da MSDN:

Produce la differenza di set di due sequenze utilizzando il comparatore di uguaglianza predefinito per confrontare i valori.

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

Questo aiuterà anche, usando un ‘params’ in argomenti e facendo quindi Except ()

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

Puoi chiamare così se non vuoi escludere nulla:

 IsListContainsDuplicates(list) 

Altrimenti, basta passare i valori dei parametri, ad esempio, se la lista è una lista di interi allora,

 IsListContainsDuplicates(list,5,4)