【问题标题】:Get data from a list in C#从 C# 中的列表中获取数据
【发布时间】:2013-06-25 09:38:36
【问题描述】:

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

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

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

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

int pos = peopleInfo[0].name;

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

【问题讨论】:

  • 这是您需要经常执行的操作,还是偶尔需要执行的操作?另外,您是否使用此列表来做很多其他事情?通过更改数据结构或创建更适合此任务的其他数据结构,您可以使其更轻松、更高效。

标签: c# list class


【解决方案1】:

你可以使用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 ...
}

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

  • 如果有多个名为"John" 的人,我会推荐ToLookup。否则你会得到“ArgumentException: An item with the same key has been added.
【解决方案3】:
int index = peopleInfo.FindIndex(p => p.name == "TheName");

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

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

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多