1

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

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

例子

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

会成为

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

3 回答 3

8
list = list.GroupBy(s => s.Split(':')[0].ToLower())
           .Select(g => g.Last())
           .ToList();
于 2013-08-22T10:27:44.847 回答
0

它可以是使用 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);

}
于 2013-08-22T10:45:33.840 回答
0

一般来说:使用字典->您正在使用列表作为字典。

我更喜欢 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])
    }
}

并且您有一本字典,这就是您想要的,如果您真的想将其转换回列表,那很好,但实际上您可能希望这是一本“一直向下”的字典

于 2013-08-22T10:33:10.907 回答