从C#中的列表中获取数据

时间:2013-06-27 18:33:52

标签: c# list class

我已经创建了一个类列表。在这里你可以看到代码:

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

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

我的问题是我有一个名字,现在我想知道年龄。我如何获得这些数据? 我可以通过以下方式获得特定位置的名称或年龄:

int pos = peopleInfo[0].name;

但我怎么能以倒置的方式做到并得到名字的位置?当我有这个时,很容易达到这个年龄。

3 个答案:

答案 0 :(得分: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 ...
}

答案 1 :(得分:4)

您可以使用FindIndex按名称查找人员。但是如果此操作频繁出现,您可能会遇到性能问题,因为每个FindIndex调用将查找整个列表,一个记录一个记录。

可能在这种情况下,最好按姓名建立人员字典。或者甚至是名字的年龄字典,如果你唯一需要的是一个人的年龄。

另外,请考虑人名不是唯一的情况。

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

答案 2 :(得分:1)

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

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

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