我有两个foreach循环,需要替换为linq才能克服性能问题。
List<string> stringList = new List<string>();
foreach (var item in list)
{
foreach (var inneritem in item)
{
stringList.Add(inneritem.data1)
}
}
List<string> stringList = new List<string>();
foreach (var item in list)
{
foreach (var inneritem in item)
{
stringList.Add(inneritem.data1)
}
}
data1字符串数据已添加到stringList。
答案 0 :(得分:14)
LINQ将使代码更整洁,而不是更快。如果不小心将100万个项目插入到列表中,将导致20个重新分配并创建19个大的临时缓冲区。
每次列表的内部缓冲区用完时,列表将创建一个两倍大的新缓冲区,并复制旧数据。旧的缓冲区将保留在内存中,直到垃圾回收器运行为止。如果内存变得非常零碎,.NET的分配器无法为新缓冲区找到足够大的内存范围,则这可能会导致内存中有很大的临时缓冲区,甚至导致OutOfMemoryException。
清理
使用LINQ的一种方法是使用两个from
子句:
var query = from item in list
from innerItem in item
select innerItem.data1;
var results=query.ToList();
另一种方法是使用SelectMany
展平嵌套的枚举,例如:
var results = list.SelectMany(item=>item)
.Select(inner=>inner.data1)
.ToList();
性能
为避免重新分配,应预先创建具有预定容量的列表。容量不一定要准确。
如果我们希望有1万个商品,我们可以创建一个容量为1万个商品的列表并将其填充到循环中:
var results=new List<string>(10000);
var query = from item in list
from innerItem in item
select innerItem.data1;
foreach(var item in query)
{
results.Add(item);
}