2016-11-01 172 views
1

我有一个像下面的字符串列表,我填写集团目前是这样的:合并在列表重复的字符串,然后合计起来

public static List<CustomDTO> mostCommonKeywords { get; set; } 

而且列表进行排序像以下:

mostCommonKeywords = key.GroupBy(v2 => v2) 
       .Select(g => new CustomDTO { Key = g.Key, Count = g.Count() }) 
       .OrderByDescending(e => e.Count).Distinct() 
       .ToList(); 

其中密钥是如下字符串列表:

var key = new List<string>(); 

密钥列表中的每个字符串元素包含o f 3个单词,如果它们相等,我需要将它们合并为1(或将它们合并为一个,无论您更喜欢哪个术语)。

像上面的分组方法给我的结果:

Samsung Galaxy S7 
Galaxy S7 edge 
Galaxy S7 Edge 
S7 edge SM 
Samsung Galaxy S7 
Samsung Galaxy S7 

正如你可以清楚地看到这里有重复的字符串的这个名单,我需要的结果是这样的:

Samsung Galaxy S7 
Galaxy S7 edge 
S7 edge SM 

所以基本上任何一个相同的字符串发生,我需要合并成一个...

我在做什么错在这里??

编辑:这里是CustomDTO类的样子:

public class CustomDTO 
    { 
     public string Key { get; set; } 
     public int Count { get; set; } 

     public List<int> Sales = new List<int>(); 
    } 

编辑:这里的事情是,我加入一个销售数量为每一个由3个字就知道字符串的关键字如何许多销售....

这是多么我已经做到了:

for (int i = 0; i < filtered.Count; i++) 
       { 
        foreach (var triad in GetAllWords(filtered[i])) 
        { 
         var sequence = triad[0] + " " + triad[1] + " " + triad[2]; 
         key.Add(sequence + " " + lista[i].SaleNumber); 
        } 
       } 

这是使字符串“不是唯一”的一部分:

+ lista[i].SaleNumber 

编辑:

mostCommonKeywords名单CustomDTO对象的列表,其中包括:

public string Key { get; set; } 
public int Count { get; set; } 
public List<int> Sales = new List<int>(); 

并假设在一切结束时,列表如下:

 Key   Sales 
Samsung Galaxy S7 5 
Galaxy S7 edge  4 
Galaxy S7 Edge  4 
S7 edge SM   3 
Samsung Galaxy S7 6 
Samsung Galaxy S7 7 

我现在如何找到所有这些重复项并将它们相加,以便列表如下所示:

Samsung galaxy S7 18 
Galaxy S7 edge 8 
S7 edge SM 3 
+0

您是否尝试过使用HashTable而不是List,或者可能调用.Distinct()? – rmjoia

+0

[使用linq删除列表中的重复项](http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq) – Adam

+0

@rmjoia我尝试使用Distinct(),它没有工作...还没有用HashTable尝试过 – User987

回答

2

当组字符串可以传递IEqualityComparer<>忽略大小写:

var keywords = key.GroupBy(v2 => v2, StringComparer.InvariantCultureIgnoreCase) 
        .Select(g => new CustomDTO { Key = g.Key, Count = g.Count() }) 
        .OrderByDescending(e => e.Count).Distinct() 
        .ToList(); 

编辑:

如果项目是像{ string Key, int Sale },你Sum()Sale属性这样:

var keywords = items.GroupBy(v2 => v2.Key, StringComparer.InvariantCultureIgnoreCase) 
        .Select(g => new CustomDTO 
        { 
         Key = g.Key, 
         Count = g.Count(), 
         Sales = g.Sum(k => k.Sale) 
        }) 
        .OrderByDescending(e => e.Count).Distinct() 
        .ToList(); 

注意:CustomDTO.Sales必须是int类型,而不是List<int>

+1

是的这个作品,谢谢! ) – User987

+0

Arturo,快速的问题,想象一下,如果我留下了那样的重复字符串。是否有一种方法让我循环遍历它们,找到所有重复的字符串并一次性总结它们的销售量?正如你所看到的,我有一个每个关键字的销售清单......我将不得不循环遍历整个清单,找到相同的清单并对它们进行汇总,然后添加重复项(即只添加1个重复字符串到新清单中以确保我没有重复)进入新的第三个列表,其中将包含所有的销售总额... – User987

+0

@ User987:我不明白你问什么,请添加一个例子。 –

1

GroupBy需要第二个参数,您可以在其中指定EqualityComparer。

这应该工作。你不需要第二Distinct呼叫

var mostCommonKeywords = key.GroupBy(v2 => v2,StringComparer.OrdinalIgnoreCase) 
     .Select(g => new CustomDTO { Key = g.Key, Count = g.Count() }) 
     .OrderByDescending(e => e.Count) 
     .ToList(); 
+1

是它的工作原理,谢谢:) – User987

+0

快速的问题,想象如果我留下重复的字符串那样..会有一种方法让我循环通过他们,找到所有重复的字符串,并一次总结他们的销售?正如你所看到的,我有一个每个关键字的销售清单......我将不得不循环遍历整个清单,找到相同的清单并对它们进行汇总,然后添加重复项(即只添加1个重复字符串到新清单中以确保我没有重复)进入新的第三名单,其中将包含所有的销售总和... – User987