【问题标题】:Recover a list item, from a list item distinct property从列表项的不同属性中恢复列表项
【发布时间】:2016-10-14 12:12:44
【问题描述】:

给定以下简单属性

Class Data
{
        public string AA { get; set; }
        public int    BB { get; set; }
        public int    CC { get; set; }
        ...
    }

和数据项列表

List<Data> Items = new List<Data>;

其中有一些示例数据

"2002", 3 ,5 ..
"2002", 3 ,5 ..
"2006", 4 ,2 ..
"2002", 3 ,5 ..
"2018", 9 ,7 ..
"2018", 5 ,5 ..

我需要找到字符串AA的不同值,所以我可以使用下面的代码

   foreach(var itm = Items.Select(x => x.AA).Distinct()))
   {
       use itm ...
   }

正确返回 itm = string "2002"、"2006" 和 "2018",但是我还需要恢复一些剩余的属性,例如 BB 等,用于 "Distinctly Selected" 项目,这也将与主要项目明显相关字段。

我尝试了很多方法来尝试实现这一目标,但都没有成功,因此如果有人能指出如何实现这一目标,我将不胜感激。

我试图恢复该项目的索引,返回基本项目,即在返回时有效的数据 列表中的所有项目。

实际上有数以万计的数据项,我需要恢复链接到不同数据项的字段。

我目前有一个可行的解决方案,我提取不同的项目,然后使用生成的列表搜索第一个匹配项目,然后恢复数据。它有效,但不是很优雅,因为我必须根据列表处理额外的时间。

请注意,此解决方案中没有 SQL 选项,提供的数据是 XML 或 JSON 解决方案必须是独立的 exe 文件

欢迎欢迎

谢谢

【问题讨论】:

  • 您是否尝试过使用Dictionary&lt;string, List&lt;Data&gt;&gt;,其中键为AA,值为具有相同AA 的所有Data 对象的列表?
  • 根据过去的经验,我发现字典在被要求处理大量项目时非常慢。我练习可能有 500,000 个项目需要处理,但这是一个想法,谢谢。

标签: c# list lambda distinct


【解决方案1】:

Distinct 只是一个没有任何聚合的 group by。您想要的是在AA 上进行分组,然后聚合这些值,特别是您想要进行第一个匹配,可以这样完成。

Items.GroupBy(x => x.AA, x => x, (x,grp) => grp.First())

【讨论】:

  • 所以对于我在冗长的代码中所做的事情来说,这似乎是一个更优雅的解决方案,我将尝试发布结果 - 谢谢
【解决方案2】:

创建另一个变量并在该变量上应用分组,它应该可以工作。

var another_item = Items.GroupBy(x => x.AA).ToList();
foreach(var itm in another_item)
{
  use itm ...
}

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多