【问题标题】:How to remove all unique objects using Linq如何使用 Linq 删除所有唯一对象
【发布时间】:2015-12-16 22:25:19
【问题描述】:

说,我有这样的LinkedList<T1>

{ A, B, C, D, E, F, G, H, I, J }

在此列表中:

B.param == C.param == F.param == p1G.param == I.param == p2,所以我必须得到下一个:

{ B, C, F, G, I }

【问题讨论】:

  • 你能分享一下你到目前为止的尝试吗?
  • 好吧,我试着用谷歌搜索它,但我发现的只是“如何删除重复项”。我还查看了文档中的Enumerable 方法列表,但找不到合适的方法。
  • 这是List 还是LinkedList?你是如何像这样初始化链表的?
  • 您是说您只希望列表中有重复项吗?
  • @YacoubMassad 不是这样,我写它是为了简化问题。

标签: c# .net linq unique


【解决方案1】:

你可以这样做:

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 毫秒。

【讨论】:

  • 呸,刚要粘贴同样的东西,我想我会给你+1。
  • 我想先用Count == 1 对元素进行分组和删除,但是先删除唯一元素然后对其余元素进行分组比对所有内容进行分组然后再删除唯一元素不是更有效吗?
  • 但是你又回到了第一格。你将如何移除独特的元素?
  • 您的列表大小是多少?
  • 这确实是更高效的方法。然而,值得注意的是,此解决方案以增加内存使用换取减少时间。如果原始序列非常大,则构建组集在空间上可能会很昂贵。
【解决方案2】:

这应该可以工作

var b = list.Where(el => list.Any(z => z.param == el.param && z != el));

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多