2013-06-14 13 views
8

muszę znaleźć, jeśli ciąg istnieć w liście, aby uniknąć duplikatów wstawia: Oto przykład ze strony Microsoft:jak używać istnieć w List <string> w 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"); 
    } 
} 

Czy to możliwe, aby zastąpić EndsWithSaurus funkcji z wyrażenie lambda? Dziękuję wszystkim za twój wkład! Oto kod roboczych:

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

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

dwie uwagi dla swojej Zamiennik: 1) w celu porównania, użyj '' zamiast == '=', który przydziela; 2) gdy metoda już zwróci wartość true, nie musisz ponownie porównywać tej wartości. –

+0

Jeśli ** tylko ** chce sprawdzić istnienie, 'HashSet ' może mieć wartość, nota –

+0

Zdajesz sobie sprawę, że twoje dwa rozwiązania są funkcjonalnie równoważne, prawda? –

Odpowiedz

14

Spróbuj tego:

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

Odpowiedź z Any() działa zbyt dobrze. Różnica jest tylko metoda Exists() pochodzi od samego List<T> i Any() jest tylko jednym z wielkich metod rozszerzenie LINQ (i będzie wymagać using System.Linq)

14

Zastosowanie Any:

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

Ty mógł użycie List.Exists() po prostu zmieniając lambda:

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

ale Any jest bardziej przenośny (tzn puszka może być używany z dowolną liczbą, a nie tylko List s.

+2

Będziemy musieli dodać 'using System.Linq' – juharr

+1

@Sevenate Nie jest problemem - twoje również działa - używam" Any "od tak dawna, że ​​zapominam, że' List.Exists() 'nawet istnieje. –

+0

@DStanley zgadzam się, to rzadkość w dzisiejszych czasach. – Sevenate