2013-06-27 58 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)));