2013-01-05 24 views
8

讓我們說,我們有列表<T>。查找多個結果的索引?

List<int> lst = new List<int>(); 
lst.Add(20); 
lst.Add(10); 
lst.Add(30); 
lst.Add(10); 
lst.Add(90); 

列表如果我需要,我會用

FindIndex() 

但是,這是20的第一個元素的索引是有可以使用的方法爲多個結果? 假設我想擁有編號爲10的元素索引。

我知道有一個方法FindAll(),但是這給了我一個新的列表insted的索引。

最好的(?)方法是獲取一個索引數組。

+0

我想知道你爲什麼需要這些指數。 – Adam

回答

11

以下代碼最大的缺點是它使用-1作爲幻數,但是在索引的情況下它是無害的。

var indexes = lst.Select((element, index) => element == 10 ? index : -1). 
    Where(i => i >= 0). 
    ToArray(); 
5

一個可能的解決方案是這樣的:

var indexes = lst.Select((item, index) => new { Item = item, Index = index }) 
       .Where(v => v.Item == 10) 
       .Select(v => v.Index) 
       .ToArray(); 

首先,你選擇的所有項目和它們的索引,那麼您篩選的項目,並最終選擇了指數

更新:如果你想封裝我的或夏娃的解決方案,你可以使用類似於

public static class ListExtener 
{ 
    public static List<int> FindAllIndexes<T>(this List<T> source, T value) 
    { 
     return source.Select((item, index) => new { Item = item, Index = index }) 
         .Where(v => v.Item.Equals(value)) 
         .Select(v => v.Index) 
         .ToList(); 
    } 
} 

然後你會使用類似:

List<int> lst = new List<int>(); 
lst.Add(20); 
lst.Add(10); 
lst.Add(30); 
lst.Add(10); 
lst.Add(90); 


lst.FindAllIndexes(10) 
    .ForEach(i => Console.WriteLine(i)); 
Console.ReadLine(); 
+0

我確實認爲Eve提供的解決方案雖然性能會更好,但是將其作爲一種方式向我展示,讓您一步一步地思考 – TimothyP

+1

結帳[MSDN](http://msdn.microsoft.com/en-us/) library/bb534869.aspx)爲另一個使用相同方法的例子 – Matthias

2

只給另一個解決方案:

Enumerable.Range(0, lst.Count).Where(i => lst[i] == 10) 

當然,它可以製成一個擴展方法:

public static IEnumerable<int> FindAllIndices<T>(this IList<T> source, T value) 
{ 
    return Enumerable.Range(0, source.Count) 
    .Where(i => EqualityComparer<T>.Default.Equals(source[i], value)); 
}