gpt4 book ai didi

c# - 在大型列表中查找具有相同属性的对象 - 性能缓慢

转载 作者:太空狗 更新时间:2023-10-30 00:38:30 26 4
gpt4 key购买 nike

我有一个很大的List<MyClass>对象,大约 600000。 MyClass有大约 10 个属性,比方说 property1 , property2等..直到property10 .

从那个列表中,我想得到 List<MyClass> 的列表对于某些属性具有相同值的对象。

例如,这意味着 property2 所在的对象, property4 , property8property10是一样的。

最好的方法是什么?目前我在我的 List<MyClass> 上循环,并在该循环中我通过 List<MyClass>.FindAll() 获得所有相似的对象, 伪代码:

forach(var item in myClassList)
{
if(!found.Contains(item))
{
var similarObjects = myClassList.FindAll(x => x.property2 == item.property2 && x.property4 == item.property4 && x.property8 == item.property8 && x.property10 == item.property10);

//adding the objects to the "already found" list
foreach(var foundItem in similarOjbects)
{
found.Add(foundItem);
}

if(similarObjects.Count > 1)
{
similarObjectsList.Add(similarObjects);
}
}
}

但这需要很长时间,List.FindAll()方法很慢。

是否有更高效的算法来做到这一点?

最佳答案

您可以使用 group by非常有效地解决这个问题:

var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};

这将为您提供一系列组,其中每个组包含所有具有相同指定属性值的对象。

例如,要迭代结果组序列的每组中的每个项目,您可以执行如下操作:

foreach (var group in grouped)
{
foreach (var item in group)
{
// Do something with item
}
}

请注意,这假设每个属性的类型都实现了 IEquatable<T>GetHashCode() .

这是一个可编译的例子:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
class Data
{
public string Name { get; set; }
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Property3 { get; set; }
public int Property4 { get; set; }
public int Property5 { get; set; }
public int Property6 { get; set; }
public int Property7 { get; set; }
public int Property8 { get; set; }
public int Property9 { get; set; }
public int Property10 { get; set; }
}

class Program
{
static void Main(string[] args)
{
List<Data> myClassList = new List<Data>
{
new Data {Name = "1A", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1B", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1C", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "2A", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2B", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2C", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "3A", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3B", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3C", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
};

var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};

foreach (var group in grouped)
{
Console.WriteLine(string.Join(", ", group.Select(item => item.Name)));
}
}
}
}

上面的例子输出:

1A, 1B, 1C
2A, 2B, 2C
3A, 3B, 3C

可能使用 PLINQ 进行优化

正如下面@BertPersyn 所提到的,您也许可以使用 PLINQ 加快速度。

为此,只需使用以下命令生成 grouped (注意添加 .AsParallel() ):

var grouped = 
from item in myClassList.AsParallel()
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};

要确定这是否真的加快了速度,您必须执行一些计时。

关于c# - 在大型列表中查找具有相同属性的对象 - 性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com