Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IEnumerable上执行get unique elements/group by操作<;T>;_C#_Performance_Ienumerable - Fatal编程技术网

C# 在IEnumerable上执行get unique elements/group by操作<;T>;

C# 在IEnumerable上执行get unique elements/group by操作<;T>;,c#,performance,ienumerable,C#,Performance,Ienumerable,我想知道如何提高以下代码的性能: public class MyObject { public int Year { get; set; } } //In my case I have 30000 IEnumerable<MyObject> data = MethodThatReturnsManyMyObjects(); var groupedByYear = data.GroupBy(x => x.Year); //Here is the where it

我想知道如何提高以下代码的性能:

public class MyObject
{
    public int Year { get; set; }
}

//In my case I have 30000
IEnumerable<MyObject> data = MethodThatReturnsManyMyObjects(); 

var groupedByYear = data.GroupBy(x => x.Year); 

//Here is the where it takes around 5 seconds
foreach (var group in groupedByYear) 
    //do something here.
公共类MyObject
{
公共整数年{get;set;}
}
//就我而言,我有30000英镑
IEnumerable data=返回名称对象()的方法;
var groupedByYear=data.GroupBy(x=>x.Year);
//这是一个大约需要5秒的过程
foreach(groupedByYear中的var组)
//在这里做点什么。
其思想是获得一组具有唯一年份值的对象。在我的场景中,列表中的30000项只包含6年,因此foreach循环将只执行6次。因此,我们有许多项目需要分组

使用带有显式IEqualityComparer的.Distinct()将是另一种选择,但不知何故,我觉得它不会有任何区别

我可以理解,如果30000件物品太多,我应该对我得到的5秒感到高兴,但我想知道,从性能角度来看,是否可以提高上述内容

谢谢

编辑: 下面的答案让我更深入地挖掘了一下,才意识到当数据从数据库加载到内存中时,我只得到了七分之一秒。延迟在foreach循环中被掩盖,因为IEnumerable的延迟执行将其延迟,直到这一点让我感到困惑,以为GroupBy()可能可以被重构为更高性能的对象


但问题仍然存在,GroupBy()命令是在这种情况下获得最佳性能的最佳方法吗?

这肯定不会花那么长时间。这是否在调试器下运行?是否抛出任何异常?在现实生活中,年度财产是否执行任何计算?老实说,它应该几乎立即执行

您是否有一个简短但完整的程序,证明它需要很长时间?(如果没有,我将尝试自己想出一个,以获得一些示例计时。)


请注意,如果返回同名对象的
方法对迭代器使用延迟执行,这可能是罪魁祸首-例如,如果调用
data.ToList()
,需要多长时间?

这肯定不会花那么长时间。这是否在调试器下运行?是否抛出任何异常?在现实生活中,年度财产是否执行任何计算?老实说,它应该几乎立即执行

您是否有一个简短但完整的程序,证明它需要很长时间?(如果没有,我将尝试自己想出一个,以获得一些示例计时。)


请注意,如果返回smanaymyobjects的
方法对迭代器使用延迟执行,这可能是罪魁祸首-例如,调用
data.ToList()
需要多长时间?

我很好奇:返回smanaymyobjects的
方法是否提供延迟计算(即,使用
yield
关键字)?如果是这样,那可能是你的罪魁祸首,而不是打电话给
GroupBy

// if MethodThatReturnsManyMyObjects uses yield, then
// it won't be executed until enumeration
IEnumerable<MyObject> data = MethodThatReturnsManyMyObjects();

// still not executed
var groupedByYear = data.GroupBy(x => x.Year); 

// finally executed here
foreach (var group in groupedByYear)
    // ...
//如果返回smanyobjects的方法使用yield,那么
//在枚举之前不会执行它
IEnumerable data=返回名称对象()的方法;
//仍未执行
var groupedByYear=data.GroupBy(x=>x.Year);
//最后在这里执行
foreach(groupedByYear中的var组)
// ...

我很想知道:您返回同名对象的
方法是否提供了惰性评估(即使用
产生
关键字)?如果是这样,可能是您的罪魁祸首,而不是调用
GroupBy

// if MethodThatReturnsManyMyObjects uses yield, then
// it won't be executed until enumeration
IEnumerable<MyObject> data = MethodThatReturnsManyMyObjects();

// still not executed
var groupedByYear = data.GroupBy(x => x.Year); 

// finally executed here
foreach (var group in groupedByYear)
    // ...
//如果返回smanyobjects的方法使用yield,那么
//在枚举之前不会执行它
IEnumerable data=返回名称对象()的方法;
//仍未执行
var groupedByYear=data.GroupBy(x=>x.Year);
//最后在这里执行
foreach(groupedByYear中的var组)
// ...

只是好奇,返回名称对象获取对象的方法在哪里?您只需要6个唯一的年份值,还是需要与这6年中的每一年对应的MyObject对象?@Ian P:数据都在内存中。它们要么从数据库中获取,要么保存在内存中,要么提供给IEnumerable,要么提交给IEnumerable我是一个缓存在内存中的对象。@Lasse:我需要6个包含唯一年份的MyObject实例。嗯……如果您使用的是惰性ORM来检索数据,那么GroupBy操作可能需要更长的时间,因为检索是在实际使用时进行的。不确定,但在我的示例中,它在le中运行不到一秒钟,有350000条记录,对象结构与您概述的相似。祝您好运!只是好奇,返回名称对象获取对象的方法在哪里?您是只需要6个唯一的年份值,还是需要与这6年中的每一年对应的MyObject对象?@Ian P:数据都在内存中。它们都是ei数据库中的数据和保留在内存中的数据被提供给IEnumerable,或者从缓存在内存中的对象提交。@Lasse:我需要6个包含唯一年份的MyObject实例。嗯……如果您使用惰性ORM检索数据,那么GroupBy操作可能需要更长的时间,因为retrieval是在实际使用时发生的。不确定,但在我的示例中,它在不到一秒钟的时间内运行,有350000条记录,对象结构与您概述的相似。祝您好运!@Jon感谢您的洞察力。我目前正在尝试提供更好的板凳时间。我会在一点时间内展示一些东西。我怀疑延迟了评估是一个问题。在我根据提供的标准制作的一个简单示例中,350000个样本几乎是即时的。@伊恩和乔恩:我自己刚刚完全体验了性能。获取数据的方法可以从数据库或内存缓存中获取数据。只要内存缓存提供数据,这个过程就需要20分钟