按列表分组并返回前1行

时间:2012-06-06 19:09:49

标签: c# linq list c#-4.0 dictionary

我有一个带键值对的列表。

  var acd = zebra.Where(v => v.Key.StartsWith("alpha"));

KEY,VALUE

  1. alphaABC,TOP323
  2. alphaBCD,BIG456
  3. alphaDEF,TOP323
  4. 我想要的是从具有相同值的多个键中仅获得一个键(任意)。 在这种情况下,1和3具有相同的值。

    我想获得如下的新列表:

    1. alphaABC,TOP323
    2. alphaBCD,BIG456
    3. 基本上只有唯一值。任何帮助?

3 个答案:

答案 0 :(得分:3)

        List<KeyValuePair<string, string>> data = new List<KeyValuePair<string, string>>() 
{ new KeyValuePair<string, string>("ABC", "TOP323"), 
new KeyValuePair<string, string>("BCD", "BIG456"), 
new KeyValuePair<string, string>("DEF", "TOP323") };

        var result = (from d in data
                     group d by d.Value
                     into g
                     select new
                                {
                                    row = g.FirstOrDefault()
                                }).ToList();

答案 1 :(得分:2)

var items = zebra
 .Where(v => v.Key.StartsWith("alpha"))
 .GroupBy(pair => pair.Value)
 .Select(group => group.First())
 .ToArray();

 foreach(var item in items)
   Console.WriteLine("{0}, {1}", item.Key, item.Value);

答案 2 :(得分:0)

使用Dictionary<TKey,TValue>

var dict = new Dictionary<string,string>(zebra.Count);
foreach (KeyValuePair pair in zebra) {
    if (!dict.ContainsKey(pair.Value)) {
        dict.Add(pair.Value, pair.Key);
    }
}

请注意,我们在此处反转键和值的含义。我们使用pair.Value作为dict中的关键字,因为我们需要唯一值。

作为替代方案,您也可以将字典声明为Dictionary<string,KeyValuePair<string,string>>并添加如下

dict.Add(pair.Value, pair);