C#中ForEach循环的性能改进技巧?
我需要优化下面的C#中ForEach循环的性能改进技巧?,c#,performance,optimization,C#,Performance,Optimization,我需要优化下面的foreach循环。foreach循环需要更多的时间来获取唯一的项 相反,可以将过滤器项转换为列表集合。如果是的话,怎么做。然后,我将采取独特的项目很容易从它 当我在FilterItems中有500000项时,问题就出现了 请提供一些优化以下代码的方法: int i = 0; List<object> order = new List<object>(); List<object> unique = new List<object>
foreach
循环。foreach循环需要更多的时间来获取唯一的项
过滤器项
转换为列表集合。如果是的话,怎么做。然后,我将采取独特的项目很容易从它int i = 0;
List<object> order = new List<object>();
List<object> unique = new List<object>();
// FilterItems IS A COLLECTION OF RECORDS. CAN THIS BE CONVERTED TO A LIST COLLECTION DIRECTLY, SO THAT I CAN TAKE THE UNIQUE ITEMS FROM IT.
foreach (Record rec in FilterItems)
{
string text = rec.GetValue(“Column Name”);
int position = order.BinarySearch(text);
if (position < 0)
{
order.Insert(-position - 1, text);
unique.Add(text);
}
i++;
}
inti=0;
列表顺序=新列表();
List unique=新列表();
//FilterItems是记录的集合。可以直接将其转换为列表集合,以便从中获取唯一的项。
foreach(在FilterItems中记录rec)
{
string text=rec.GetValue(“列名”);
int position=order.BinarySearch(文本);
如果(位置<0)
{
顺序。插入(-位置-1,文本);
唯一。添加(文本);
}
i++;
}
当我们对它一无所知的时候,不清楚你的意思是“把过滤项转换成一个列表”,但是你可以在你得到所有的项目之后,考虑分类,而不是按你的方式去排序:
var strings = FilterItems.Select(record => record.GetValue("Column Name"))
.Distinct()
.OrderBy(x => x)
.ToList();
在这里使用Distinct()
可以避免对大量相同的项目进行排序-看起来您仍然只需要不同的项目
如果您希望unique
保持原始顺序,但order
保持相同的项目,只需排序,您可以使用:
var unique = FilterItems.Select(record => record.GetValue("Column Name"))
.Distinct()
.ToList();
var order = unique.OrderBy(x => x).ToList();
现在,Distinct()
不能保证保持顺序,但在当前的实现中它是这样做的,这也是最自然的实现。Hi@NicoSchertler谢谢……但是隐式转换是有问题的……你能解释一下怎么做吗……我还需要访问“记录”中的一个方法。还有,当你只添加文本时,为什么要使用List
?我们怎么知道FilterItems
是否可以转换成列表,当我们什么都不知道的时候?嗨@乔恩·斯基特,谢谢。。我的意思是,我可以直接将“FilterItem”集合绑定到一个列表或任何其他ienumerable集合中吗?我只是问“@Arun:对不起,我还是一点都不明白你的意思-你不是很清楚,你还没有告诉我们FilterItem从何而来……详细地说-“FilterItems”来自一个名为“FilteredCollection”…我可以使用FilterItems[index]从FilterItems访问记录。它有记录集合。我询问是否有机会将此集合直接绑定到列表或Ienumerable(使用隐式或显式转换)@Arun:这并不是很详细-我们甚至还不知道FilterItems
的编译时类型。我也不知道你所说的“直接将此集合绑定到列表”是什么意思“-看起来它已经是某种类型的IEnumerable
。然而,在这一点上,听起来它与这里的主要问题真的是一个不同的问题,所以我建议你问一个包含更多信息的新问题。