2011-11-22 12 views
24

Problema: Verifica se x ∉ {2, 3, 61, 71}C#: Il modo più elegante per verificare se int x è l'elemento di un determinato set?

spesso chiesto se non esiste un modo migliore di:

if (x != 2 && x != 3 && x != 61 && x != 71) 
{ 
    // do things 
} 

e

if (!new List<int>{ 2, 3, 61, 71 }.Contains(x)) 
{ 
    // do things 
} 

Quest'ultimo uno sembra abbastanza elegante, ma in realtà è piuttosto irritante se lo leggi, soprattutto a causa dell'inversione. È una specie di brutta cosa perché in inglese diciamo "x non è un elemento di ...", che è difficile da esprimere in C# senza fastidioso sovraccarico. Forse uno coud dire if (Object(x).IsElementOf(new[] { ... })) o così?

Hmm .. qualche suggerimento? Esistono metodi standard .Net per testare cose del genere?

+2

Questo è un duplicato, ma sto avendo un po 'di problemi a trovare l'altra domanda che mi ... – BoltClock

+0

non posso votare a chiudere, esaurito, ma http://stackoverflow.com/questions/163732/recommended-net-class-for-a-collection-of-unique-integers – user7116

+5

@Efrain, volevi dire '&&' invece di '|| '? I due frammenti di codice non fanno la stessa cosa ... –

risposta

41

io uso un metodo di estensione:

using System.Linq; 

... 

public static bool In<T>(this T item, params T[] list) 
{ 
    return list.Contains(item); 
} 

... 


if (!x.In(2,3,61,71)) 
... 

È possibile rinominarlo IsElementOf, se si preferisce questo nome ...

+0

Nota per le persone che potrebbero meravigliarsi, il metodo' Contains' sull'array è fornito dai namespace LINQ. –

+1

@AdamHouldsworth, buon punto, grazie. Ho aggiunto la clausola using necessaria per chiarire –

+0

Nessun problema, +1 in entrambi i casi per uno snippet molto carino Non mi vergogno di ammettere che probabilmente lo plagierò in futuro :-) –

0
var list=CreateNewList(); //returns your list of elements 
var element=GetElement(); //returns an element that might be in the list 
if(list.Any(x=>x.Equals(element)) 
{ 
    //do something 
} 

E 'ancora invertito da quello che si è abituati a ma è più espressivo (se la lista ha un valore uguale a un elemento).

5

è possibile utilizzare il metodo seguente LinQ:

var list = new List<int> { 1, 2, 3, 4, 5 }; 
var number = 3; 

if (list.Any(item => item == number)) 
    //number is in the list 

E per la leggibilità si può mettere in un metodo di estensione:

public static bool IsElementOf(this int n, IEnumerable<int> list) 
{ 
    return list.Any(i => n == i); 
} 

//usage 
if(3.IsElementOf(list)) //in the list 
0

Supponendo che intendevi & & e non ||, si può basta scrivere una funzione e utilizzarla per tutto il codice. Puoi accorciare la nuova parte [] poiché il tipo (int) viene dedotto dal parametro in di func.

Func<int, bool> IsSafe = x => !new[] { 2, 3, 61, 71 }.Contains(x); 

Console.WriteLine(IsSafe(68)); // is true 
Console.WriteLine(IsSafe(2)); // is false 
1

che dire

if(new[] { 2, 3, 61, 71 }.Except(x).FirstOrDefault() != 0) 
{ 
    ... 
} 

o qualcosa su queste linee?

5

vecchia questione, ma non ho visto questa semplice risposta:

!new []{2, 3, 61, 71}.Contains(x) 
Problemi correlati