使用LINQ

时间:2016-03-17 08:34:06

标签: c# linq group-by

我有一个对象列表(对象名称是NGramm),对象有一个属性 - 字符串列表(属性名称是RawNGramWords)。 RawNGramWords还有另一个属性 - NGramCount - 这是LIST中具有相同RawNGramWords的对象的数量(不同NGramm中相同的字符串列表)。因此,如果列表中有3个对象(NGramm)具有相同的RawNGramWords,我只需要获得一个NGrammm属性= 3的NGramm对象。应该从列表中删除具有相同RawNGramWords列表的其他2个对象。 我用了这段代码:

public static List<NGramm> CountNWordsInNGrams(List<NGramm> listOfNgramms)
    {
        List<int> indexesOfNGramsInListToDelete = new List<int>(); 
        for(int i = 0; i < listOfNgramms.Count; i++)
        {
            for(int j = i+1; j < listOfNgramms.Count; j++)
            {
                bool areEquivalent = !listOfNgramms[i].RawNGramWords.Except(listOfNgramms[j].RawNGramWords).Any();
                if(areEquivalent == true)
                {
                    indexesOfNGramsInListToDelete.Add(i);
                    listOfNgramms[j].NGramCount = listOfNgramms[j].NGramCount + listOfNgramms[i].NGramCount + 1;

                }
            }
        }

        for (int i = listOfNgramms.Count; i >= 0; i--)
        {
            if (indexesOfNGramsInListToDelete.Contains(i))
            {
                listOfNgramms.RemoveAt(i);
            }
        }

        return listOfNgramms;
    }

这种方法的速度非常慢。 (它会错误地计算NGramCount - 但总的来说由于速度慢而无关紧要 - 我需要另一种方法来在这些对象中找到相同的字符串列表)。 那么 - 有没有办法使用group by来计算具有相同List(RawNGramWords)和LINQ的对象? 谢谢

1 个答案:

答案 0 :(得分:0)

此示例将List NGrammRawNGramWords个对象按Dictionary<string[], List<NGramm>>属性分组到string[]

字典的键(RawNGramWords)是NGramm个对象的NGramm属性。

假设您的 class NGramm { public string[] RawNGramWords; public int NGramCount; } 课程看起来像这样:

List<NGramm>

您可以使用List<NGramm> listOfNgramms; Dictionary<string[], List<NGramm>> groupedResults = (from ngramm in listOfNgramms group ngramm by ngramm.RawNGramWords into groupedNGramms select groupedNGramms).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

执行此操作
sudo php bin/magento setup:static-content:deploy

在旁注中,您发布的代码正在执行一些我不完全理解其原因的事情(例如,重新迭代第一次迭代的尾部)。这减缓了它。