如何在C#中使用Exist in List<string>?

19

我需要在列表中查找字符串是否存在,以避免重复插入:

以下是来自 Microsoft 网站的示例:

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

是否可以用lambda表达式替换EndsWithSaurus函数? 感谢大家的建议!这是一个可行的代码:

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

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

2
更换时需注意两点:1)进行比较时使用==,而不是用于赋值的=;2)当方法已经返回true时,无需再次比较该值。 - Hans Kesting
如果你只是想检查存在性,HashSet<T> 可能会有价值,请注意。 - Marc Gravell
你意识到你的两个解决方案在功能上是等效的,对吧? - D Stanley
是的,我意识到了。我只是有点纠结不知道该把哪个回答标记为答案,你的还是Sevenante的。因为Sevenante的积分比你少,所以我就选择了他的 :) - GenZiy
2个回答

35

试试这个:

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

Any()方法的答案也可以正常工作。区别只在于Exists() 方法来自于List<T>本身,而Any()是伟大的Linq扩展方法之一(需要using System.Linq)。


17

使用 Any

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

通过仅更改 lambda 表达式,您可以使用 List.Exists()

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

但是Any更具可移植性(即它可以与任何可枚举对象一起使用,而不仅仅是List)。


3
需要添加 using System.Linq - juharr
1
@Sevenate 没问题 - 你的也可以用 - 我已经使用 Any 很长时间了,都忘记了 List.Exists() 的存在。 - D Stanley
@DStanley同意,这在现今很少见。 - Sevenate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接