2013-06-27 90 views
1

我有一個List<string>包含文件路徑。如何檢查列表中是否有特定文件file.txt?優選地,返回不是bool值但是 列表 元素或元素的索引的方法。搜索列表<T>

我讀過List<T>文檔,但它只是困惑我,因爲我是一個程序員開始,我的英語不是很好。

+0

可能的重複[Search list of基於對象變量的對象](http://stackoverflow.com/questions/3154310/search-list-of-objects-based-on-object-variable) – CodeCaster

+1

list.Find(item => item.Contains(「file。文本」)); –

回答

8

使用Where得到的值的列表:

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

情況下或者在使用FirstOrDefault單一元素或null它沒有發現

+2

@downvoter:原因? – Tigran

+0

可能它的大小寫敏感,但我不能閱讀頭腦。 – Jodrell

+1

,並且在問題中明確指出,OP想要一個匹配列表或indecies。 – Jodrell

1

使用LINQ(假設你havethe路徑字符串):

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

這一個不會找到「File.txt」,你也混了f和n –

+0

@SchlaWiener原因混合n和f或者其他原因? – CloudyMarble

+0

我沒有downvote - 這只是一個提示。 –

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; 

會做。

+0

錯誤。這也會找到「myfile.txt」! –

+0

@SchlaWiener,正確,+1爲你 – Jodrell

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)); 
} 
+1

這將崩潰,如果它不在那裏? –

+0

由於缺失而不能編譯)。 – Sayse

+0

@JohnySkovdal忘了這一點,謝謝。 – James

2

如果您的列表包含完整路徑(如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(); 
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"); 
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)));