使用 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 NET 3.5 SP1:使用 LINQ 按两个字段分组,并为组的所有成员分配一个相关的唯一 ID(整数)
C# LINQ 与两个不同数据集上的条件 where 子句连接