将foreach循环转向Linq

Tra*_*ent 1 c# linq

无论如何都要将每个循环写入Linq表达式:

private List<string> datasetItemset;
Dictionary<string, int> itemsetScanning = new Dictionary<string, int>();
List<string> itemList = new List<string>();
foreach (string transaction in this.datasetItemset)
{
    string[] items = transaction.Split(new char[] { ' ' });
    foreach (string item in items)
        if (!itemList.Contains(item))
        {
            itemList.Add(item);
            itemsetScanning.Add(item, 0);
        }
}
Run Code Online (Sandbox Code Playgroud)

我的下一个问题是,使用linq表达式而不是foreach循环加速程序的性能,我对这个linq有点新意.

更新:使用太多的foreach循环会减慢我的程序速度.

Ree*_*sey 6

使用linq表达式而不是foreach循环加速了程序的性能,我对这个linq有点新鲜.

不可以.在内部,LINQ通常仍会执行相同数量的迭代,因此通常情况下,它不会加快速度.写得正确,LINQ的表现与循环非常相似.

使意图更清晰是非常有用的,这反过来有时可以使优化和缩短curcuit更简单.话虽这么说,同样的优化也可以在循环上轻松完成.

无论如何都要将每个循环写入Linq表达式:

是.这可以通过以下方式完成:

foreach(var item in this.datasetItemset
   .SelectMany(transaction => transaction.Split(' '))
   .Distinct())
{
    itemList.Add(item);
    itemsetScanning.Add(item, 0);
}
Run Code Online (Sandbox Code Playgroud)

请注意foreach,在这种情况下,内部主体/循环有意地保留为循环,因为它正在执行副作用.

鉴于您正在构建列表和集合,您可以使用:

var itemList = this.datasetItemset.SelectMany(transaction => transaction.Split(' ')).ToList();
var uniqueSet = new HashSet<string>(itemList); // Build the set from the list
Run Code Online (Sandbox Code Playgroud)

这将为您提供一组唯一值(作为a HashSet<string>)以及值列表.如果您只需要一个唯一的值列表,则可以使用Distinct它直接构建它:

 var uniqueItemList = this.datasetItemset
                          .SelectMany(transaction => transaction.Split(' '))
                          .Distinct()
                          .ToList();
Run Code Online (Sandbox Code Playgroud)

如果你需要字典,那么它只是取这些结果:

var itemsetScanning = uniqueItemList.ToDictionary(i => i, i => 0);
Run Code Online (Sandbox Code Playgroud)