我有List<string>
个包含文件的路径。如何检查列表中是否有特定文件,例如file.txt
?优选地,方法不返回bool
值而是 list 元素或元素的索引。
我已经阅读了List<T>
文档,但它只是让我感到困惑,因为我是一名初学程序员而且我的英语不是很好。
答案 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)));