Linq 获取 Distinct ToDictionary

Linq get Distinct ToDictionary

仅 select/get 个基于 i.Code 的不同条目需要帮助。 有重复项,因此我的表达式“已添加具有相同键的项目。

 var myDictionary = dbContext.myDbTable
            .Where(i => i.shoesize>= 4)
            .OrderBy(i => i.Code)              
            .ToDictionary(i => i.Code, i => i);

已尝试使用 Select and/or Distinct 以不同的组合使用,但仍然出现相同的错误

var myDictionary= dbContext.myDbTable
            .Where(i => i.shoesize>= 4)
            .OrderBy(i => i.Code)
            //.Select(i => i)
            //.Distinct()
            .ToDictionary(i => i.Code, i => i);

有人可以帮忙吗? C#

更新:如果有多个对象具有相同的代码,我只想将第一个对象(具有该特定代码)添加到 myDictionary。

您可以按 Code 和 select 分组,每个组中的第一项(相当于不同):

var myDictionary = dbContext.myDbTable
            .Where(i => i.shoesize >= 4)      // filter
            .GroupBy(x => x.Code)             // group by Code
            .Select(g => g.First())           // select 1st item from each group           
            .ToDictionary(i => i.Code, i => i);

您不需要 OrderBy,因为 Dictionary 代表无序集合。如果你需要一个有序的字典,你可以使用 SortedDictionary.

在我看来,您正在寻找的是 .DistinctBy()(在 .NET 6 中可用),它允许您指定哪个 属性 来区分集合中的元素:

var myDictionary= dbContext.myDbTable
            .Where(i => i.shoesize>= 4)
            .DistinctBy(i => i.Code)
            .ToDictionary(i => i.Code, i => i);

通过首先划分它并创建一个列表,与将其全部捆绑到一个 linq 中相比,它可以工作,猜测 First() 需要它在列表中才能使其成为字典。

var firstLinq = dbContext.myDbTable
           .Where(i => i.shoesize>= 4)
           .ToList();

然后

 var finalLinq = fromConcurWithDuplicates
            .GroupBy(i => i.Code)
            .Select(i => i.First())
            .ToList()
            .ToDictionary(i => i.Code, i => i);