c# - 使用 linq 将列表转换为字典而不用担心重复

标签 c# linq dictionary

我有一个 Person 对象列表。我想转换为字典,其中键是名字和姓氏(串联),值是 Person 对象。

问题是我有一些重复的人,所以如果我使用这段代码就会爆炸:

private Dictionary<string, Person> _people = new Dictionary<string, Person>();

_people = personList.ToDictionary(
    e => e.FirstandLastName,
    StringComparer.OrdinalIgnoreCase);

我知道这听起来很奇怪,但我现在并不真正关心重复名称。如果有多个名字,我只想拿一个。无论如何,我是否可以在上面编写这段代码,以便它只采用其中一个名称并且不会在重复项上爆炸?

最佳答案

LINQ 解决方案:

// Use the first value in group
var _people = personList
    .GroupBy(p => p.FirstandLastName, StringComparer.OrdinalIgnoreCase)
    .ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);

// Use the last value in group
var _people = personList
    .GroupBy(p => p.FirstandLastName, StringComparer.OrdinalIgnoreCase)
    .ToDictionary(g => g.Key, g => g.Last(), StringComparer.OrdinalIgnoreCase);

如果您更喜欢非 LINQ 解决方案,那么您可以这样做:

// Use the first value in list
var _people = new Dictionary<string, Person>(StringComparer.OrdinalIgnoreCase);
foreach (var p in personList)
{
    if (!_people.ContainsKey(p.FirstandLastName))
        _people[p.FirstandLastName] = p;
}

// Use the last value in list
var _people = new Dictionary<string, Person>(StringComparer.OrdinalIgnoreCase);
foreach (var p in personList)
{
    _people[p.FirstandLastName] = p;
}

关于c# - 使用 linq 将列表转换为字典而不用担心重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319016/

相关文章:

c# - Xpath 通配符(例如 : "/Data/Customers/D*")

linq - 如何将 Expression<Func<T, bool>> 转换为 Expression<Func<Type, bool>>?

c++ - 如何从函数/类接收 map<A, B>&?

dictionary - flutter 如何从 future 功能访问 map

c# - 从 Action Script 到 C# 的 Rijndael 加密

c# - 从 WinForms 应用程序中删除 ClickOnce

c# - 具有动态可编辑列的 DataGrid

linq - 获取组中存在的第一项和最后一项

c# - 带有语句体的 lambda 表达式不能转换为表达式树(Lambda 和 Linq)

python - 如何调用循环中生成的变量