你可以这样做:
list = new LinkedList<T1>(
list
.GroupBy(x => x.param)
.Where(x => x.Count() > 1)
.SelectMany(x => x));
您按param 属性对项目进行分组(这就像创建一个组列表,每个组包含共享param 属性值相同的项目)。
在您的示例中,这将创建 7 个组:
{A}, {B,C,F}, {D}, {E}, {G,I}, {H}, {J}
然后,您通过仅获取具有多个项目的组来过滤组(从而删除具有单个项目的组)。
如果保留包含多个项目的组,则保留 {B,C,F} 和 {G,I}。
然后您通过SelectMany 将这些组展平为单独的项目,这会为您提供 {B,C,F,G,I}。
性能测试:
如果您的列表可能很大,那么您应该考虑性能。我提供的解决方案非常有效,您可以通过以下方式对其进行测试并与其他解决方案进行性能比较:
List<T1> list = new List<T1>();
Random rnd = new Random();
for (int i = 0; i < 10000; i++)
{
list.Add(new T1 { param = rnd.Next(1,5000).ToString()});
}
Stopwatch sw = Stopwatch.StartNew();
var result1 =
list
.GroupBy(x => x.param)
.Where(x => x.Count() > 1)
.SelectMany(x => x)
.ToList();
long result1_time = sw.ElapsedMilliseconds;
sw.Restart();
var result2 = list.Where(el => list.Any(z => z.param == el.param && z != el)).ToList();
long result2_time = sw.ElapsedMilliseconds;
Console.WriteLine(result1_time);
Console.WriteLine(result2_time);
Console.ReadLine();
在我的机器上,我的解决方案大约需要 3 毫秒,而另一个解决方案大约需要 2500 毫秒。