【问题标题】:Searching List<T>搜索列表<T>
【发布时间】:2013-06-24 20:08:22
【问题描述】:

我有一个包含文件路径的List&lt;string&gt;。如何检查我的列表中是否有特定文件,例如file.txt?最好是返回的方法不是 bool 值,而是 list 元素或元素的索引。

我已经阅读了List&lt;T&gt; 文档,但它只是让我感到困惑,因为我是一名初级程序员,而且我的英语不是很好。

【问题讨论】:

标签: c#


【解决方案1】:

使用Where 获取值列表:

      var found = fileList.
            Where((f)=>System.IO.Path.GetFileName(f)
                                  .Equals(SEARCH_VALUE, 
                                   StringComparison.InvariantCultureIgnoreCase)); 

或使用FirstOrDefault 表示单个元素或使用null 以防找不到

【讨论】:

  • 可能是区分大小写,不过我看不懂。
  • 它在问题中明确指出 OP 想要一个匹配或不道德的列表。
  • @Jodrell:好点,改成 Where call,所以 OP 得到了结果列表。
  • 糟糕,不清楚但甚至是错误的。我已经编辑了我的问题。对不起
【解决方案2】:

如果您的列表包含完整路径(如 c:\windows\system.ini"),我会使用 System.IO.Path.GetFileName 并记住搜索大小写密集

var result = from f in files
             where Path.GetFileName(f).Equals("file.txt",
                   StringComparison.InvariantCultureIgnoreCase)
             select f;

bool found = result.Any();

【讨论】:

    【解决方案3】:

    IndexOf 方法是您所需要的,如果您想找到完全监视您正在寻找的路径的路径。

    但是,如果您要在列表中查找以某个文件名结尾的路径,您可以这样做,

    var matches = paths.Select((path, i) => new { Path = path, Index = i })
        .Where(item => Path.GetFileName(item.Path).Equals(
            "file.txt",
            StringComparison.OrdinalIgnoreCase));
    

    但是,请注意matches 将是一个包含 0 个或多个匹配项的序列。所以,你可以这样做,

    if (matches.Any())
    {
        // I found something.
        foreach (var match in matches)
        {
           var matchIndex = match.Index;
           var matchPath = match.Path;
        }
    }
    else
    {
        // Oops, no matches.
    }
    

    或者,如果你只想要第一个。

    var firstMatchPath = matches.First().Path;
    

    会的。

    【讨论】:

    • 错了。这也会找到“myfile.txt”!
    【解决方案4】:

    如果您只想要第一个值(如果有的话),那么您可以这样做。

    var value = mylist.FirstOrDefault(x=>x.EndsWith("file.txt"));
    

    或者如果你想对每个匹配的字符串做一些事情。

    foreach (string value in mylist.Where(x=>x.EndsWith("file.txt")) )
    {
        // Do whatever you intend with value.
    }
    

    或者如果你想要一个值的索引列表,那么你可以试试这个。

    var indexValues = new List<int>();
    foreach (string value in mylist.Where(x=>x.EndsWith("file.txt")) )
    {
        indexValues.Add(mylist.IndexOf(value));
    }
    

    【讨论】:

    • 如果它不存在会崩溃吗?
    • 因为缺少 ),所以无法编译。
    • 错了,也会找到“myfile.txt”。
    • 糟糕,问题是字符串中是否包含文件名。谢谢,已更改为适合问题。
    【解决方案5】:

    使用 LINQ(假设您将路径作为字符串):

    var found = from f in fileList where f.equals("file.txt") select f; 
    

    【讨论】:

    • 这个找不到“File.txt”,你也混合了f和n
    • @SchlaWiener 混合 n 和 f 的原因还是其他原因?
    【解决方案6】:

    考虑到你有路径和文件名位于路径的末尾:

            //List of elements
            List<string> foundElements = myInitialList.Where(s => s.EndsWith("file.txt")).ToList();
    
            //List of Indexes (base on lift of elements here above)
            List<int> indexList = new List<int>();
            foundElements.ForEach(f => indexList.Add(myInitialList.IndexOf(f)));
    

    【讨论】:

      【解决方案7】:

      从您的问题中不清楚,但似乎该列表将包含文件路径,但您要查找的是文件名。

      以下代码将为您提供路径名列表中第一次出现名为“file.txt”的文件的索引,如果不在列表中,则为 -1。

      注意它如何使用Path.GetFileName()。这是为了匹配“c:\dir1\dir2\file.txt”而不是“c:\dir1\dir2\wrongfile.txt”。

      int index = filenames.FindIndex(filename => Path.GetFileName(filename).Equals("file.txt", StringComparison.OrdinalIgnoreCase));
      

      但是,如果您正在搜索整个路径,那么您可以这样做:

      int index = filenames.FindIndex(filename => filename.Equals("file.txt", StringComparison.OrdinalIgnoreCase));
      

      注意我们如何比较整个文件名而不是使用“EndsWith”。

      如果文件名已经全部小写并且您正在比较整个路径,那么您可以进行更简单的搜索:

      int index = filenames.IndexOf("file.txt");
      

      或者如果它们都是大写的,你必须这样做:

      int index = filenames.IndexOf("FILE.TXT");
      

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 2013-06-15
        • 2014-05-19
        • 2020-06-26
        • 2013-10-28
        • 2010-12-04
        • 2011-08-01
        • 1970-01-01
        相关资源
        最近更新 更多