【问题标题】:Merging duplicate strings in List and summing them合并 List 中的重复字符串并将它们相加
【发布时间】:2017-03-14 18:19:30
【问题描述】:

我有一个字符串列表,如下所示,我目前填写和分组如下:

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

键列表中的每个字符串元素由 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

【问题讨论】:

  • 您是否尝试过使用 HashTable 而不是 List,或者调用 .Distinct()?
  • @rmjoia 我用 Distinct() 试过了,没用...还没试过 HashTable
  • 你从哪里得到你的名单?数据库什么的?
  • 我试过了,它应该可以正常工作。小提琴:dotnetfiddle.net/R7HVoO

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


【解决方案1】:

当您对字符串进行分组时,您可以传递 IEqualityComparer&lt;&gt; 以忽略大小写:

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&lt;int&gt;

【讨论】:

  • Arturo,问个简单的问题,想象一下,如果我这样留下重复的字符串.. 有没有办法让我循环遍历它们并找到所有重复的字符串并一次汇总它们的销售额?如您所见,我有每个关键字的销售列表...我必须遍历整个列表并找到相同的列表并将它们相加,然后添加重复项(即仅将 1 个重复的字符串添加到新列表中以确保我没有重复)进入新的第三个列表,该列表将包含所有销售总和......
  • @User987:我不明白你问的是什么,请补充一个例子。
  • 我已经更新了我原来的问题,你能看看吗?
  • 有什么办法可以让 Sales 成为 List
  • 如果您想要销售值(而不是总和),您可以执行 Sales = g.Select(k =&gt; k.Sale).ToList(),但在输出中您显示的是总和,因此 Sales 必须是整数,而不是列表。
【解决方案2】:

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 个重复的字符串添加到新列表中以确保我没有重复)进入新的第三个列表,该列表将包含所有销售总和......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2021-01-10
相关资源
最近更新 更多