我以为这很简单,但不幸的是我找不到我正在寻找的答案。我想要实现的是,如果它们重复,则返回一个独特结果列表,否则返回 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});
这样做的问题是,当我列表中只有 1 个没有重复项时 - 当我希望它返回 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"}
预期成果:无
请帮忙。
这里
不需要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();