如果在DistinctBy中找不到重复项,则返回0

时间:2017-02-10 02:29:35

标签: c# linq morelinq

我认为这很简单,但不幸的是我无法找到我正在寻找的答案。 我想要实现的是,如果它们被重复,则返回一个独特结果列表,否则返回0而不是单数项。 我到目前为止的代码是,第一个不同的by应返回所有不同的行,然后第二个将它们进一步向下过滤:

List<Server> serversWithBothAffinity = filteredServers
    .DistinctBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot, x.ServerAffinity})
    .DistinctBy(x => new {x.ServerVersion, x.ServerName, x.ServerSlot});

这个问题是,当我在列表中只有一个没有重复项的项时 - 当我希望它返回0时,这段代码仍会返回1.

快乐的一天场景,当它全部按照我的意愿工作时,给出以下内容:

{1.0, "ServerName1", "ServerSlotA", "Europe"}
{1.0, "ServerName1", "ServerSlotA", "Pacific"}
{1.0, "ServerName2", "ServerSlotB", "Europe"}
{1.0, "ServerName2", "ServerSlotA", "Pacific"}

结果按预期正确:

{1.0, "ServerName1", "ServerSlotA"}

问题场景,给出以下内容:

{1.0, "ServerName1", "ServerSlotA", "Europe"}

结果不正确:

{1.0, "ServerName1", "ServerSlotA"}

预期结果:没有

请帮忙。

1 个答案:

答案 0 :(得分:3)

这里你不需要MoreLINQ:

List<Server> serversWithBothAffinity = filteredServers
    .GroupBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot})
    .Where(g => 1 < g.Count())
    .Select(g => g.First())
    .ToList();

DistinctBy的问题在于,在应用它之后,您无法分辨每个“组”中有多少项 - 它将生成单个项目

你也可以使用漂亮的查询语法(好吧,除了ToList部分)

var serversWithBothAffinity = 
      from s in  filteredServers
      group s by new { s.ServerVersion, s.ServerName, s.ServerSlot} into g
      where 1 < g.Count()
      select g.First();