1

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

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

4

7 回答 7

8

使用Where获取值列表:

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

或对单个元素使用FirstOrDefaultnull或以防万一

于 2013-06-27T10:55:38.603 回答
2

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;

会做。

于 2013-06-27T10:57:34.550 回答
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();
于 2013-06-27T11:01:28.507 回答
1

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

var found = from f in fileList where f.equals("file.txt") select f; 
于 2013-06-27T10:55:40.630 回答
1

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

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));
}
于 2013-06-27T10:58:46.867 回答
0

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

        //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)));
于 2013-06-27T11:09:53.203 回答
0

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

以下代码将为您提供路径名列表中第一次出现名为“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");
于 2013-06-27T11:03:50.280 回答