2012-01-20 10 views
5

Ad esempio se in una casella di testo che contiene molti numeri di parte diversi da un elenco di materiali per le parti del computer, voglio solo un tipo di cavo cat5 in qualsiasi momento e se vengono visualizzati due tipi diversi, per avvisare l'utente. I numeri di parte del cavo cat5 potrebbero essere: cat5PART # 1, cat5PART # 2 e cat5PART # 3. Quindi se un solo numero di codice cat5 non viene visto, non preoccuparti, ma non appena vengono visualizzati due tipi diversi o più, per avvisare. Potrei facilmente scriverlo manualmente tre volte diverse per ogni variazione, ma su un elenco più grande di parti, ci vorrebbe più tempo e rischiamo di sbagliare. Inoltre, mi piacerebbe solo sapere come i programmatori gestiscono questo tipo di funzione. Inoltre, non so come si chiama, quindi non sono sicuro di come google, anche se sapendo che ci saranno molte soluzioni per questa esatta situazione là fuori, quindi è frustrante dover infettare le persone su un forum per qualcosa di così sempliceCome evitare di scrivere ogni variazione di una semplice istruzione "if contains" per diverse stringhe

Un esempio del mio codice che ovviamente non funziona perché sarebbe solo avvisare se tutte e tre le parti sono state rilevate non solo se due sono state rilevate è inferiore. Presumo che userei qualche variazione di & e | o forse è qualcosa di completamente diverso?

Fondamentalmente io non voglio avere a scrivere su una scala più ampia

se contiene parte 1 e parte 2

se contiene parte 1 e parte 3

se contiene la parte 2 e parte 3

Grazie.

if ((textBox2.Text.Contains("PART#1")) 
     && (textBox2.Text.Contains("PART#2")) 
     && (textBox2.Text.Contains("PART#3"))) 
       { 
      MessageBox.Show("2 types of cat5 part numbers seen at the same time"); 
       } 
+0

Certamente non sta aiutando che stai avvolgendo le tue sottoespressioni in parentesi non necessarie. – ChaosPandion

+1

... ma certamente non fa male, quindi non vedo come questo sia rilevante per la domanda. –

+0

Ho provato a rimuovere le parentesi e ho ricevuto degli errori, potresti aiutarmi a capire quali dovrei rimuovere solo per poterlo sapere? Inoltre è per una migliore facilità di lettura del codice, o migliora le prestazioni quando si hanno meno parentesi su larga scala?Thx – Saintjah

risposta

6

Si può provare questo:

string[] parts = new [] {"PART#1", "PART#2", "PART#3"}; 
int count = parts.Count(s => textBox2.Text.Contains(s)); 
if (count >= 2) ... 
+0

Grazie mille a te e al brokenglass, ora ha molto senso. Devo pensare di più fuori dagli schemi. – Saintjah

4

È possibile utilizzare Linq/Count() per verificare se almeno x stringhe che si desidera testare sono contenuti in textBox2.Text:

string[] parts = { "PART#1", "PART#2", "PART#3" }; 
if(parts.Count(s=> textBox2.Text.Contains(s)) >= 2) 
{ 
    MessageBox.Show("2 types of cat5 part numbers seen at the same time"); 
} 
0

Aggiungere ogni stringa in un List<string> e poi scorrere ciascuno con un foreach dichiarazione.

1

Essenzialmente questo problema è risolto progettando le cose un po 'diversamente.

Ciò che si desidera è eseguire una sorta di convalida delle regole su alcuni input, quindi probabilmente creerò qualcosa di un po 'più generico in questo modo, quindi ogni regola conterrà una serie di proprietà che desidera controlla. Chiameresti questo da un tipo generico di fase di elaborazione contro input per elaborare i dati.

Sembra un po 'esagerato, forse, ma in generale è bello fare cose come questa in modo da essere preparati ai cambiamenti.

Alla fine (nella regola specifica stessa) avresti chiaramente un'implementazione un po 'come la tua, ma probabilmente hai scritto in un modo più breve, come ha dimostrato BrokenGlass.