3

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

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

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

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

int pos = peopleInfo[0].name;

但是我怎样才能做到倒置并获得名称的位置呢?当我有这个很容易得到年龄。

4

3 回答 3

5

您可以使用以下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 ...
}
于 2013-06-27T18:37:05.367 回答
4

您可以使用 FindIndex 按姓名查找人员。但是如果这个操作很频繁,你可能会遇到性能问题,因为每个 FindIndex 调用都会逐条查找整个列表。

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

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

List<People> peopleInfo = new List<People>() { ... };
Dictionary<string, People> map = peopleInfo.ToDictionary(p => p.name);
People p = map["John"];
于 2013-06-27T18:44:05.477 回答
1
int index = peopleInfo.FindIndex(p => p.name == "TheName");

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

People person = peopleInfo.FirstOrDefault(p => p.name == "TheName");
于 2013-06-27T18:41:01.087 回答