搜索列表<t> </t>

时间:2013-06-27 10:52:38

标签: c#

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

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

7 个答案:

答案 0 :(得分:8)

使用Where获取值列表:

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

或使用FirstOrDefault表示单个元素,或null表示未找到

答案 1 :(得分: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;

会做的。

答案 2 :(得分: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 :(得分:1)

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

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

答案 4 :(得分: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));
}

答案 5 :(得分: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");

答案 6 :(得分: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)));