将C#中的List<object>转换成Dictionary<key, <object>>

18

我是一名初学者C#开发者,需要从我的列表中创建一个对象字典。首先,让我定义我的对象为Person。

public class Person 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

现在我有一个人对象的列表。List<Person> 如何使用 LinQ 查询将其转换为 Person 字典? 我想要的输出是:

Dictionary<key, <Person>>

每个Person对象都有一个递增的整数作为key值。

我在网上找到了这段代码,但它只适用于List<string>。

List<string> List1
var toDict = List1.Select((s, i) => new { s, i })
             .ToDictionary(x => x.i, x => x.s)

这里的“keys”是什么?名称?ID? - Ian
你想让键完全是一个新整数还是与你的 Person.Id 属性相同? - Vladyslav
3
请问创建只有数字作为键的字典的原因是什么?你想做什么,为什么要这样做? - Saleem
@Ian 我需要这个键是一个全新的整数。 - super-user
@Saleem 我需要这个键是一个全新的整数。 - super-user
显示剩余4条评论
4个回答

22

最直接的方法之一就是使用 int key 作为 key 像这样:

List<Person> List1 = new List<Person>();
int key = 0; //define this for giving new key everytime
var toDict = List1.Select(p => new { id = key++, person = p })
    .ToDictionary(x => x.id, x => x.person);

关键在于 lambda 表达式:

p => new { id = key++, person = p }

创建一个匿名的 对象,其中包含 idperson 属性。其中,id 是增量的 key,而 person 则是你的 List<Person> 的元素。

如果你需要使用 PersonId,只需使用:

List<Person> List1 = new List<Person>();
var toDict = List1.Select(p => new { id = p.Id, person = p })
    .ToDictionary(x => x.id, x => x.person);

2
非常感谢您提供了一份完整的面向新手友好的答案。我稍后会选择这个作为答案(回答得太快了,再等5分钟)。 - super-user
1
@super-user 没问题。 :) 学习可能需要一些时间,但希望你能理解 - 我特意为你提供了一些说明,以便你能够理解你找到的示例中 Lambda 表达式的工作原理。 - Ian
@super-user,如果您想要更高效的方法而不是从您的示例开始,请查看Seprum的答案。 - Ian
最后一个“.Select”语句多了一个“(”,应该将其删除。 - Abhishek

15

这应该适用于您的情况:

int key = 0; // Set your initial key value here.
var dictionary = persons.ToDictionary(p => key++);

其中personsList<Person>类型。


你可以轻松赢得代码高尔夫挑战。+1 - Victor Zakharov
1
谢谢!简洁明了。+1 抱歉回答晚了一分钟没被选为答案。 - super-user
@super-user:[低声说] 你总是可以更改你接受的答案。 :) http://meta.stackexchange.com/questions/120568/is-it-possible-to-change-the-chosen-answer - Victor Zakharov

4
您已经接近成功了,只需要将变量类型从List<string>更改为List<Person>,您就可以顺利进行。您可以像之前一样使用LINQ查询,例如:
List<Person> persons = new List<Person>();

var p1 = new Person();
p1.Name = "John";
persons.Add(p1);

var p2 = new Person();
p2.Name = "Mary";
persons.Add(p2);

var toDict = persons.Select((s, i) => new { s, i })
             .ToDictionary(x => x.i, x => x.s);

然而,在这种情况下,虽然我不反对使用LINQ,但使用常规循环会更容易阅读,像这样:

var result = new Dictionary<int, Person>();
for (int i = 0; i < persons.Count; i++)
{
    result.Add(i, persons[i]);
}

Jon Skeet建议使用另一种方法,使用Enumerable.Range,我测试过了,它完美地工作:

var toDict = Enumerable.Range(0, persons.Count)
             .ToDictionary(x => x, x => persons[x]);

1
谢谢!也感谢您的建议,我会仔细研究一下。+1 - super-user

1
这是我的解决方案:
var key = 0;
IDictionary<int, Person> personDictionary = personList
    .Select(x => new KeyValuePair<int,Person>(key++, x))
    .ToDictionary(y => y.Key, y => y.Value);

其中personListList<Person>类型的列表。


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