将值合并到单个列表中

本文关键字:列表 单个 合并 | 更新日期: 2023-09-27 18:28:32

我有一个带有冒号分隔值的简单List<string>

但是,有些值在冒号前可能相同,但在冒号后可能不同。我需要根据最后一个最大值合并这两个值。

示例

name:john
surname:michael
gender:boy
name:pete
title:captain

将成为

surname:michael
gender:boy
name:pete
title:captain

将值合并到单个列表中

list = list.GroupBy(s => s.Split(':')[0].ToLower())
           .Select(g => g.Last())
           .ToList();

一般来说:使用字典-->您使用的是List作为字典。

我更喜欢LazyDictionarys,你可以在不检查密钥存在的情况下更新,但对于伪代码中的标准.Net Dict

dict = new Dictionary()
for each item in your_LIST
{
    tmp = item.Split(':')
    if dict.ContainsKey(tmp[0]) 
    {
       dict[tmp[0]] = tmp[1]
    }
    else
    {
       dict.Add(tmp[0],tmp[1])
    }
}

如果你有一本字典,这就是你想要的,如果你真的想把它转换回列表,那就好了,但实际上你可能希望它是一本字典

使用linq 可以是锥形

private string[] inputs = new string[]
{
    "name:john",
    "surname:michael",
    "gender:boy",
    "name:pete",
    "title:captain",
};
private string[] expected = new string[]
{
    "surname:michael",
    "gender:boy",
    "name:pete",
    "title:captain",
};

private static List<string> FilterList(IEnumerable<string> src) {
    return src.Select(s =>
    {
        var pieces = s.Split(':');
        return new {Name = pieces[0], Value = pieces[1]};
    }).GroupBy(m => m.Name)
      .Select(g => String.Format("{0}:{1}", g.Key, g.Last().Value)).ToList();;
}
[TestMethod]
public void TestFilter() {
    var actual = FilterList(inputs);
    CollectionAssert.AreEquivalent(expected, actual);
}