【发布时间】:2020-08-19 08:34:08
【问题描述】:
我有一个 Diff 对象列表 差异看起来像这样
public class Diff
{
ChangeAction Action // ChangeAction is an Enum
string Type
DateTime StartDateTime
DateTime EndDateTime
int rateId
string rateDescription
List<string> properties
DayOfWeek day
List<DaysOfWeek> DaysOfWeek
DayOfWeek DayOfWeek
}
我的 LINQ 查询没有按照我认为的那样执行。我在GroupBy() 中传入diff.properties,这是一个列表,我希望它在列表中的所有字符串值都匹配时进行分组
var results = diffs
.GroupBy(diff => new { diff.properties, diff.Action, diff.Type, diff.StartDateTime,
diff.EndDateTime, diff.rateId, diff.rateDescription})
.Select(group => new Diff(
group.Key.Action,
group.Key.ScheduleType,
group.Key.StartDateTime,
group.Key.EndDateTime,
group.Key.rateId,
group.Key.rateDescription,
group.Key.properties,
group
.Select(ts => ts.DayOfWeek)
.Distinct()
.OrderBy(dow => dow)
.ToList()))
.ToList();
results 和 diffs 之间的唯一区别在于,以前存储在 diffs 中的单数 DayOfWeek 现在被放入复数 DaysOfWeek 字段(但列表中只有一项)。目前,results 和 diffs 中的项目数量相同。
我希望在结果列表中看到的是:
- 一个较短的列表,基于对所有分组(包括 diff.properties 列表值)的匹配进行合并
- 这也意味着 DaysOfWeek 列表中有超过 1 个项目。
我的问题是:
如何更改上面的 LINQ 查询以查看我想在 results 中看到的内容?
【问题讨论】:
-
@Enigmativity - 你误解了这个问题吗?
-
@Enigmativity 我刚才在底部添加了我的问题,谢谢
-
@TravisJ - 不,但 OP 最初只是给出了一系列声明。他们没有解释他们被困在哪里,他们做了什么尝试,或者明确地问我们他们需要我们什么。复习一下How to Ask 可能会有用。
-
如果你在
Diff中覆盖Equals,这个问题会更容易解决。 -
您的一个
GroupBy属性(diff.properties) 是List<string>。List<T>的默认比较器是参考比较,因此在这种情况下没有两个列表会匹配。您需要为Diff类编写自己的比较器,您可以在其中使用.SequenceEqual来确定@987654344@ 中的strings之间的相等性。可能同样的事情也适用于Action属性。