我有一個List<string>
包含文件路徑。如何檢查列表中是否有特定文件file.txt
?優選地,返回不是bool
值但是
列表
元素或元素的索引的方法。搜索列表<T>
我讀過List<T>
文檔,但它只是困惑我,因爲我是一個程序員開始,我的英語不是很好。
我有一個List<string>
包含文件路徑。如何檢查列表中是否有特定文件file.txt
?優選地,返回不是bool
值但是
列表
元素或元素的索引的方法。搜索列表<T>
我讀過List<T>
文檔,但它只是困惑我,因爲我是一個程序員開始,我的英語不是很好。
使用Where得到的值的列表:
var found = fileList.
Where((f)=>System.IO.Path.GetFileName(f)
.Equals(SEARCH_VALUE,
StringComparison.InvariantCultureIgnoreCase));
情況下或者在使用FirstOrDefault單一元素或null
它沒有發現
使用LINQ(假設你havethe路徑字符串):
var found = from f in fileList where f.equals("file.txt") select f;
這一個不會找到「File.txt」,你也混了f和n –
@SchlaWiener原因混合n和f或者其他原因? – CloudyMarble
我沒有downvote - 這只是一個提示。 –
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」! –
@SchlaWiener,正確,+1爲你 – Jodrell
如果你只是想第一個值,如果有一個,那麼你可以做到這一點。
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));
}
如果您的列表包含完整路徑(如C:\ WINDOWS \ SYSTEM.INI「),我會用System.IO.Path.GetFileName
,也記住搜索情況intenstive
var result = from f in files
where Path.GetFileName(f).Equals("file.txt",
StringComparison.InvariantCultureIgnoreCase)
select f;
bool found = result.Any();
這並不明朗你的問題,但似乎該列表將包含文件路徑,但你正在尋找的是一個文件名。
下面的代碼會給你一個名爲「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");
考慮到您的路徑和文件名位於路徑末尾:
//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)));
可能的重複[Search list of基於對象變量的對象](http://stackoverflow.com/questions/3154310/search-list-of-objects-based-on-object-variable) – CodeCaster
list.Find(item => item.Contains(「file。文本」)); –