我有一个List<string>
包含文件路径。如何检查我的列表中是否有特定文件,例如file.txt
?最好是返回不是bool
值而是列表元素或元素索引的方法。
我已经阅读了List<T>
文档,但它只是让我感到困惑,因为我是一个初级程序员,而且我的英语不是很好。
我有一个List<string>
包含文件路径。如何检查我的列表中是否有特定文件,例如file.txt
?最好是返回不是bool
值而是列表元素或元素索引的方法。
我已经阅读了List<T>
文档,但它只是让我感到困惑,因为我是一个初级程序员,而且我的英语不是很好。
使用Where获取值列表:
var found = fileList.
Where((f)=>System.IO.Path.GetFileName(f)
.Equals(SEARCH_VALUE,
StringComparison.InvariantCultureIgnoreCase));
或对单个元素使用FirstOrDefaultnull
或以防万一
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;
会做。
如果您的列表包含完整路径(如 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();
使用 LINQ(假设您将路径作为字符串):
var found = from f in fileList where f.equals("file.txt") select f;
如果您只想要第一个值(如果有的话),那么您可以这样做。
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));
}
考虑到您的路径和文件名位于路径的末尾:
//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)));
您的问题尚不清楚,但似乎该列表将包含文件路径,但您要查找的是文件名。
以下代码将为您提供路径名列表中第一次出现名为“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");