LINQ GroupBy x其中有多个x和y是唯一的

时间:2013-01-09 15:23:52

标签: c# linq linq-to-objects

让这样的对象:

class foo
{
    public String x{ get; set; }
    public String y{ get; set; }
}

var bar = new List<foo> {
 new foo{ x= "u", y= "w"},
 new foo{ x= "s", y= "q"},
 new foo{ x= "u", y= "r" },
 new foo{ x= "1", y= "0" },
 new foo{ x= "1", y= "0" },
};

我想将这些组合在一起,其中x是相同的,但y是不同的。

这将使我得到x,其中x是相同的,而且有一个以上。

 bar.GroupBy(x => x.x).Where(x => x.Count() > 1).ToList();

这是我得到的:

foo{ x= "u", y= "w"}
foo{ x= "u", y= "r" }
foo{ x= "1", y= "0" }
foo{ x= "1", y= "0" }

这是我想要的:

foo{ x= "u", y= "w"}
foo{ x= "u", y= "r" }

那么如何过滤出y相同的那些呢?

更新

条形图中有3,999,996个对象,其中三个都正常工作。

bar.GroupBy(f => f.x).Where(a => a.Select(f => f.y).Distinct().Skip(1).Any()).ToList(); // Elapsed ms = 702,715,779,666 AVG = 715
bar.GroupBy(f => f.x).Where(a => a.Count() > 1 && a.Any(b => b.y!= a.First().y)).ToList(); // Elapsed ms = 753,701,728,749 AVG = 732
bar.GroupBy(f => f.x).Where(a => a.Skip(1).Any() && a.Any(b => b.y!= a.First().y)).ToList(); //  Elapsed ms = 734,751,758,745 AVG = 747

2 个答案:

答案 0 :(得分:4)

几乎就在那里!

bar.GroupBy(f => f.x)
   .Where(g => g.Select(f => f.y).Distinct().Skip(1).Any())
   .ToList();

g.Select(f => f.y).Distinct().Count()说“从组中的y获取所有foo值,丢弃任何重复项,然后计算它们。” / p>

修改.Skip(1).Any()优于.Count() > 1,因为它会在找到第二项后立即停止查找,而不是找到一百万,然后转{{1} }。通常我第一次就做对了......

(请注意,您的结果不是a million > 1的列表,而是foo个组的列表,其中每个组都有一个常量foo。)

答案 1 :(得分:1)

试试这个:

bar
  .GroupBy(a => a.x)
  .Where(a => a.Count() > 1 && a.Any(b=>b.y != a.First().y))
  .ToList();