2013-06-14 16 views
8

devo trovare se la stringa esiste in un elenco per evitare duplicati inserti: Ecco ad esempio dal sito Microsoft:come utilizzare esistere in List <string> in C#

using System; 
using System.Collections.Generic; 

public class Example 
{ 
    public static void Main() 
    { 
     List<string> dinosaurs = new List<string>(); 

     dinosaurs.Add("Compsognathus"); 
     dinosaurs.Add("Amargasaurus"); 
     dinosaurs.Add("Oviraptor"); 
     dinosaurs.Add("Velociraptor"); 
     dinosaurs.Add("Deinonychus"); 
     dinosaurs.Add("Dilophosaurus"); 
     dinosaurs.Add("Gallimimus"); 
     dinosaurs.Add("Triceratops"); 

     Console.WriteLine(); 
     foreach(string dinosaur in dinosaurs) 
     { 
      Console.WriteLine(dinosaur); 
     } 

     Console.WriteLine("\nTrueForAll(EndsWithSaurus): {0}", 
      dinosaurs.TrueForAll(EndsWithSaurus)); 

     Console.WriteLine("\nFind(EndsWithSaurus): {0}", 
      dinosaurs.Find(EndsWithSaurus)); 

     Console.WriteLine("\nFindLast(EndsWithSaurus): {0}", 
      dinosaurs.FindLast(EndsWithSaurus)); 

     Console.WriteLine("\nFindAll(EndsWithSaurus):"); 
     List<string> sublist = dinosaurs.FindAll(EndsWithSaurus); 

     foreach(string dinosaur in sublist) 
     { 
      Console.WriteLine(dinosaur); 
     } 

     Console.WriteLine(
      "\n{0} elements removed by RemoveAll(EndsWithSaurus).", 
      dinosaurs.RemoveAll(EndsWithSaurus)); 

     Console.WriteLine("\nList now contains:"); 
     foreach(string dinosaur in dinosaurs) 
     { 
      Console.WriteLine(dinosaur); 
     } 

     Console.WriteLine("\nExists(EndsWithSaurus): {0}", 
      dinosaurs.Exists(EndsWithSaurus)); 
    } 

    // Search predicate returns true if a string ends in "saurus". 
    private static bool EndsWithSaurus(String s) 
    { 
     return s.ToLower().EndsWith("saurus"); 
    } 
} 

E 'possibile sostituire EndsWithSaurus funzione con espressione lambda? Grazie a tutti per il vostro contributo !! Ecco un codice di lavoro:

 if (dinosaurs.Any(e => e.EndsWith("saurus"))) 
      Console.WriteLine("saurus exists"); 

     if (dinosaurs.Exists(e => e.EndsWith("saurus"))) 
      Console.WriteLine("saurus exists"); 
+2

Due osservazioni per il vostro sostituzione: 1) per confrontare, utilizzare '' == invece di '=', che assegna; 2) quando il metodo restituisce già true, non è necessario confrontare nuovamente tale valore. –

+0

Se ** solo ** desidera verificare esistenza, un 'HashSet ' può avere un valore, nota –

+0

Ti rendi conto che le tue due soluzioni sono funzionalmente equivalenti, giusto? –

risposta

14

Prova questo:

if (dinosaurs.Exists(e => e.EndsWith("saurus"))) 
     Console.WriteLine("saurus exists"); 

La risposta con Any() funziona troppo bene. La differenza è solo il metodo Exists() viene da List<T> stessa e la Any() è solo uno dei grandi metodi di estensione Linq (e richiederà using System.Linq)

14

Uso Any:

if (dinosaurs.Any(e => e.EndsWith("saurus"))) 
     Console.WriteLine("saurus exists"); 

È potrebbe uso List.Exists(), semplicemente cambiando il vostro lambda:

if (dinosaurs.Exists(e => e.EndsWith("saurus")) // == true is implied 
     Console.WriteLine("saurus exists"); 

ma Any è più portabile (cioè può essere utilizzato con qualsiasi enumerable, non solo List s.

+2

Sarà necessario aggiungere 'using System.Linq' – juharr

+1

@Sevenate Non è un problema - anche il tuo funziona - Sto usando' Any' per così tanto tempo che dimentico che 'List.Exists()' esiste anche. –

+0

@DStanley sono d'accordo, è raro oggigiorno. – Sevenate

Problemi correlati