[C#]使得 LINQ 向字典方法体

标签: Linq C#
发布时间: 2017/2/27 3:54:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的两个几乎完全相同 (唯一的例外是一个得到 .ToDictinct() ,和另一个不) 调用。它是可能使他们陷入一种方法,我可以调用,并在一个地方更改吗?

private void Splitter1(string[] file)
{               
    tempDict = file
        .SelectMany(i => File.ReadAllLines(i)
        .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', '{', '[', '(', '}', ']', ')',
        '<', '>', '-', '=', '/', '"', ';', ':', '+', '_', '*' }, StringSplitOptions.RemoveEmptyEntries))                    
        .AsParallel()
        .Select(word => word.ToLower()) 
        .Where(word => !StopWords.Contains(word))
        .Where(word => !PopulatNetworkWords.Contains(word)) 
        .Where(word => !word.All(char.IsDigit))
        .Distinct())
        .GroupBy(word => word)                    
        .ToDictionary(g => g.Key, g => g.Count());
}
private void Splitter2(string[] file)
{               
    tempDict = file
        .SelectMany(i => File.ReadAllLines(i)
        .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', '{', '[', '(', '}', ']', ')',
        '<', '>', '-', '=', '/', '"', ';', ':', '+', '_', '*' }, StringSplitOptions.RemoveEmptyEntries)))                    
        .AsParallel()
        .Select(word => word.ToLower()) 
        .Where(word => !StopWords.Contains(word))
        .Where(word => !PopulatNetworkWords.Contains(word)) 
        .Where(word => !word.All(char.IsDigit))
        .GroupBy(word => word)                    
        .ToDictionary(g => g.Key, g => g.Count());
}

解决方法 1:

因为两者之间的不同是是否 Distinct() 称,并且自 Distinct() 既工作又返回 IEnumerable<T> (或工作,并返回 IQueryable<T> 。然后第一次创建相应的 IEnumerable<T> ,然后决定是否将其替换的结果调用 Distinct() ,然后继续︰

private void Splitter(string[] file, bool distinct)
{               
  IEnumerable<string> query = file
    .SelectMany(i => File.ReadAllLines(i)
    .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', '{', '[', '(', '}', ']', ')',
    '<', '>', '-', '=', '/', '"', ';', ':', '+', '_', '*' }, StringSplitOptions.RemoveEmptyEntries))                    
    .AsParallel()
    .Select(word => word.ToLower()) 
    .Where(word => !StopWords.Contains(word))
    .Where(word => !PopulatNetworkWords.Contains(word)) 
    .Where(word => !word.All(char.IsDigit));
  if(distinct)
    query = query.Distinct());
  return query
    .GroupBy(word => word)                    
    .ToDictionary(g => g.Key, g => g.Count());
}

(顺便说一下,你可能会发现更新 ReadLines 作品比 ReadAllLines ,特别是与大型文件。 ReadAllLines 将所有行读入内存立即,而不阅读它们,你使用它们,所以它浪费了大量的内存和处理延迟)。

赞助商