用linq

时间:2019-06-12 10:10:06

标签: c# linq

我有两个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。

1 个答案:

答案 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);
}