2013-06-27 139 views
3

我創建了一個類的列表。在這裏,您可以看到代碼:從C列表中獲取數據#

public class People{ 
     public string name; 
     public int age;  
    } 

public List<People> peopleInfo = new List<People>(); 

我的問題是,我有例如一個名字,現在我想知道的年齡。我如何獲得這些數據? 我可以得到一個名稱或本上的特定位置的年齡:

int pos = peopleInfo[0].name; 

但我怎麼能做到這一點的倒方式獲得名的位置?當我有這個很容易獲得年齡。

+1

這是您需要頻繁操作的操作,還是僅僅是偶爾?另外,你是否使用這個列表來做很多其他的事情?通過更改數據結構或創建額外的數據結構,更適合於此任務,可以使它更簡單,更高效。 – Servy

回答

4

可以使用FindIndex方法:

var searchForName = "John"; 
int index = peopleInfo.FindIndex(p => p.name == searchForName); 

這將返回第一人指數,其name屬性等於"John"列表。當然,可能有很多人的名字是"John",你可能想要找到他們。爲此,您可以使用LINQ:

IEnumerable<int> indexes = peopleInfo.Select((p, i) => new { p, i }) 
            .Where(x => x.p.name == searchForName) 
            .Select(x => x.i); 
foreach(int i in indexes) 
{ 
    peopleInfo[i].age ... 
} 

但是,如果你並不真正需要的指數,這是更簡單:

foreach(People person in peopleInfo.Where(p => p.name == searchForName)) 
{ 
    person.age ... 
} 
+0

什麼是'=>'?我以前在[這個答案]中看到它(http://stackoverflow.com/a/1344242/1275574) – AminM

+1

它是lambda運算符,是生成lambda表達式的一部分:http://msdn.microsoft.com/en-us/ library/vstudio/bb397687.aspx –

+1

@JesonPark它定義了一個[** lambda表達式**(又名匿名函數)](http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx) –

1
int index = peopleInfo.FindIndex(p => p.name == "TheName"); 

或者,你可以只找到直接對象...

People person = peopleInfo.FirstOrDefault(p => p.name == "TheName"); 
4

您可以使用FindIndex按名稱查找人員。但是如果這個操作頻繁發生,您可能會遇到性能問題,因爲每個FindIndex調用都會查看整個列表,一個一個地查找。

也許在這種情況下,最好是按名字建立人物詞典。甚至根據姓名字典年齡,如果你唯一需要的是一個人的年齡。

此外,請考慮人名不唯一的情況。

List<People> peopleInfo = new List<People>() { ... }; 
Dictionary<string, People> map = peopleInfo.ToDictionary(p => p.name); 
People p = map["John"]; 
+3

如果有多個名爲'「John」'的人,我會推薦'ToLookup'。否則,你會得到「* ArgumentException:具有相同密鑰的項目已被添加。*」 –