从C#中的列表获取数据

3

我创建了一个类的列表,以下是代码:

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

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

我的问题是,比如我有一个名字,现在我想知道这个人的年龄。我该怎么获取这些数据? 我可以通过以下方式获取特定位置上的姓名或年龄:

int pos = peopleInfo[0].name;

但是我该如何反过来做并获取名称的位置?有了这个,就容易得到年龄。


1
这是您需要经常执行的操作还是偶尔需要执行的操作?此外,您是否使用此列表来完成许多其他任务?通过更改数据结构或创建另一个更适合此任务的数据结构,您可以使其更加简便和高效。 - Servy
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 ...
}

1
这是lambda表达式的一部分,即lambda运算符:http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx - Mike Precup
1
@JesonPark 它定义了一个Lambda表达式(又名匿名函数) - p.s.w.g

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: An item with the same key has already been added.*”的错误提示。 - p.s.w.g

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

或者,您可以直接找到对象...
People person = peopleInfo.FirstOrDefault(p => p.name == "TheName");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接