我有一个像下面这样的字符串列表,我填写和分组如下:
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">
}
答案 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();