【发布时间】:2015-05-21 09:02:51
【问题描述】:
我在更改一些代码后遇到了问题。我的想法是这样的:我在统计文档中的单词数,但是每个文档只有1个单词的副本,例如:
文档 1 = Smith Smith Smith Smith => Smith x1
文档 2 = Smith Alan Alan => Smith x1, Alan x1
文档 3 = John John => John x1
但铁匠的总数应该:
Smith x2(3 个文档中的 2 个),Alan x1(3 个文档中的 1 个),John x1(3 个文档中的 1 个)
我认为它之前有一个单独的方法来区分(如果distinct = false 也计算所有单词),现在它只产生1。
之前的代码:
private Dictionary<string, int> tempDict = new Dictionary<string, int>();
private void Splitter(string[] file)
{
tempDict = file
.SelectMany(i => File.ReadAllLines(i)
.SelectMany(line => line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
.AsParallel()
.Select(word => word.ToLower())
.Distinct())
.GroupBy(word => word)
.ToDictionary(g => g.Key, g => g.Count());
}
它应该被改变,所以它返回字典,但在制作应用程序的过程中将它改为这个代码:
private Dictionary<string, int> Splitter(string[] file, bool distinct, bool pairs)
{
var query = file
.SelectMany(i => File.ReadLines(i)
.SelectMany(line => line.Split(new[] { ' '}, StringSplitOptions.RemoveEmptyEntries))
.AsParallel()
.Select(word => word.ToLower())
.Where(word => !word.All(char.IsDigit)));
if (distinct)
{
query = query.Distinct();
}
if (pairs)
{
var pairWise = query.Pairwise((first, second) => string.Format("{0} {1}", first, second));
return query
.Concat(pairWise)
.GroupBy(word => word)
.ToDictionary(g => g.Key, g => g.Count());
}
return query
.GroupBy(word => word)
.ToDictionary(g => g.Key, g => g.Count());
}
还要注意query = file.Distinct(); 只返回文档的名称。所以它必须是不同的东西。
@编辑 这就是我调用此方法的方式:
private void EnterDocument(object sender, RoutedEventArgs e)
{
List<string> myFile= new List<string>();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = true;
openFileDialog.Filter = "All files (*.*)|*.*|Text files (*.txt)|*.txt";
if (openFileDialog.ShowDialog() == true)
{
foreach (string filename in openFileDialog.FileNames)
{
myFile.Add(filename);
}
}
string[] myFiles= myFile.ToArray();
myDatabase = Splitter(myFiles, true, false);
}
【问题讨论】:
标签: c# linq dictionary distinct