无论如何都要将每个循环写入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循环会减慢我的程序速度.
使用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)
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |