通过忽略重复键创建字典

Create a Dictionary by ignoring repeating keys

假设我有这个词典:

var Dict = Dictionary<Obj, Value>

我想创建一个新的:

var Dict2 = Dictionary<Obj.ParentId, Value>

但是,可能存在具有相同 ParentId 的对象,因此在创建新词典时会出现问题。具有相同 ParentId 的任何两个条目都将具有相同的值,因此我只关心保留其中一个条目。有没有办法通过 LINQ 轻松做到这一点?

执行此操作的最简单方法可能是强制使用循环。在这种方法中,最后一个获胜 - 但是,正如您所说,这对您的情况无关紧要:

var dict2 = new Dictionary<Obj.ParentId, Value>();

foreach (var (key, value) in dict1)
{
    dict2[key.ParentId] = value;
}

您也可以使用 LINQ 执行此操作,但它的性能可能较低,因为它必须先执行 'distinct' 部分:

var dict2 = dict1
    .DistinctBy(x => x.Key.ParentId)
    .ToDictionary(x => x.Key.ParentId, x => x.Value);

您可以使用 Linq:查询 Dictmaterialize 结果为 Dict2

var Dict2 = Dict
  .GroupBy(pair => pair.Key.ParentId, pair => pair.Value)
   // Or group.Last().Value or some other logic
  .ToDictionary(group => group.Key, group => group.First().Value); 

或者您可以尝试循环:

var Dict2 = Dictionary<Obj.ParentId, Value>();

foreach (var pair in Dict)
  Dict2.TryAdd(pair.Key.ParentId, pair.Value);