合并List中的重复字符串并将它们相加

时间:2016-11-01 15:14:14

标签: c# asp.net asp.net-mvc linq asp.net-mvc-5

我有一个像下面这样的字符串列表,我填写和分组如下:

  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>();

其中Key是字符串列表,如下所示:

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

键列表中的每个字符串元素由3个单词组成,如果它们相等,我需要合并为1个单词(或者将它们组合成一个单词,无论你喜欢哪个更多)。

上面的分组方法给出了以下结果:

Samsung Galaxy S7   
Galaxy S7 edge  
S7 edge SM  

正如您可以清楚地看到此字符串列表中存在重复项,我需要将结果看起来像这样:

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

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

因此,基本上只要出现相同的字符串,我需要将其合并为一个...

我在这里做错了什么?

编辑:以下是CustomDTO类的外观:

   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);
                    }
                }

编辑:这里的事情是我在每个字符串中添加一个销售号码,其中包含3个单词,以了解哪个关键字有多少销售....

我就是这样做的:

 + lista[i].SaleNumber

这是使字符串&#34;不唯一的部分&#34;:

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

编辑:

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

      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

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

@using (Html.BeginForm("Login", "CotrollerName", FormMethod.Post))
{
    <label for="UserName">User Name:</label>
     @Html.TextBoxFor(model => model.UserName)
     <label for="Password">User Name:</label>
     @Html.TextBoxFor(model => model.Password)
     <input type="submit" value="Submit">
 } 

2 个答案:

答案 0 :(得分: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 :(得分: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();