使用 LINQ C# 将公共数据分组到新字符串中

Posted

技术标签:

【中文标题】使用 LINQ C# 将公共数据分组到新字符串中【英文标题】:Grouping common data into new string with LINQ C# 【发布时间】:2021-03-02 08:24:16 【问题描述】:

基本上,我有一个对象列表 - 包含这些字符串字段的事件:

Date:
Event_Name: 
Event_Time:
Event_Place:

当然,有些事件是在同一天发生的,这就是我的问题所在:

我想将共享相同日期(键)的事件组合在一起,并创建一个新字符串,其中将包含同一日期的所有事件。

例子:

之前:

Object 1:

Date: 2020/11/27
Event_Name: Dinner
Event_Time: 5pm
Event_Place: Johhny’s

Object 2:

Date: 2020/11/27
Event_Name: Dentist
Event_Time: 11am
Event_Place: Street 15

分组后:

Object:

Date: 2020/11/27
Event_Name: Dinner Dentist
Event_Time: 5pm 11am
Event_Place: Johhny’s Street 15

我尝试使用 LINQ 对它们进行分组——这有效,但不是我想要的方式——它将它们组合在一起,但它没有将它们“保存”为一个字符串。

有什么办法可以做到吗?

【问题讨论】:

【参考方案1】:

这应该可行:

var grpByDate = allEvents.GroupBy(e => e.Date).Select(e =>
new Event

  Date = e.Key,
  Event_Name = string.Join(" ", e.SelectMany(x => x.Event_Name)),
  Event_Time = string.Join(" ", e.SelectMany(x => x.Event_Time)),
  Event_Place = string.Join(" ", e.SelectMany(x => x.Event_Place)),
);

【讨论】:

【参考方案2】:

当然,这可以使用 Enumerable.GroupBy 的重载之一。使用带参数 resultSelector 的重载:

// make groups of events where every event in the group has the same date:
var result = allEvents.GroupBy(event => event.Date,

    // parameter resultSelector: take every Date, and all events on this date to make
    // one new:
    (date, eventsOnThisDate) => new
    
        Date = date,
        Names = String.Join(' ', eventsOnThisDate.Select(event => event.Event_Name)),
        Times = String.Join(' ', eventsOnThisDate.Select(event => event.Event_Time)),
        Places = String.Join(' ', eventsOnThisDate.Select(event => event.Event_Place)),
    );

但是,您确定要这个吗?您将无法看到每个事件将在何处/何时发生。将每个日期的所有事件都放在该日期,每个事件的时间/名称/地点不是更有用吗?

// parameter resultSelector:
(date, eventsOnThisDate) => new

     Date = date,
     EventsOnThisDate = eventsOnThisDate.Select(event => new
     
         Time = event.event_Time,
         Name = event.event_Name,
         Place = event.event_Place,
     )
     .ToList(),
);

【讨论】:

以上是关于使用 LINQ C# 将公共数据分组到新字符串中的主要内容,如果未能解决你的问题,请参考以下文章

C#中的LINQ问题

C# LINQ NET 3.5 SP1:使用 LINQ 按两个字段分组,并为组的所有成员分配一个相关的唯一 ID(整数)

Linq 高级分组 + 计数到新模型

C# LINQ 与两个不同数据集上的条件 where 子句连接

.NET(C#) System.Linq中实现多列group by(分组)的示例代码

如何在 LINQ C# 中仅过滤 2 列分组中的最后一个值