【问题标题】:C# Distinct in LINQ queryLINQ 查询中的 C# 不同
【发布时间】: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


    【解决方案1】:

    Distinct() 将从您的IEnumerable 中删除重复项,因此在以下之前调用它...

    return query
        .GroupBy(word => word)
        .ToDictionary(g => g.Key, g => g.Count());  
    

    ...将生成所有唯一单词的列表,但计数为 1。

    编辑:

    要解决合并所有行的问题,您可以执行以下操作:

    List<string> allFilesWords = new List<string>();
    foreach (var filename in file)
    {
        var fileQuery = File.ReadLines(filename)
            .SelectMany(line => line.Split(new[] { ' '}, StringSplitOptions.RemoveEmptyEntries))
            .AsParallel()
            .Select(word => word.ToLower())
            .Where(word => !word.All(char.IsDigit)));
        allFilesWords.AddRange(fileQuery.Distinct());
    }
    return allFilesWords
            .GroupBy(word => word)
            .ToDictionary(g => g.Key, g => g.Count());       
    

    【讨论】:

    • 那么我如何计算这个词包含多少个文件中的实数呢?我已经修改了我的称呼方式。
    • 为每个文件创建一组不同的单词,然后将所有集合合并在一起并像以前一样分组以获得整体单词使用情况。您当前代码的问题是您正在将所有文件中的所有行与SelectMany(i =&gt; File.ReadLines(i)) 合并。在这一点上,哪一行属于哪个文件的知识被删除。
    • 我认为它是基于文件而不是 ALL_FILES_AT_ONCE .. 奇怪。
    • 请记住,在传递给下一个 LINQ 函数之前,每个语句都会产生一个 IEnumerable 结果。 SelectMany()IEnumerable 集合结果合并到单个 IEnumerable 集合中。在这种情况下,File.ReadLines(i)IEnumerable 结果与所有其他文件 File.ReadLines() 结果合并。如果您调用Select(i =&gt; File.Readlines(i)),您的结果集将是IEnumerable&lt;IEnumerable&lt;string&gt;&gt;,没有直接关联文件,但每个iEnumerable&lt;string&gt; 将是一个文件的内容。
    • 当然,但你说的是每个文件合并单词,但如果它自动一次自动合并所有单词,我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2010-12-02
    相关资源
    最近更新 更多