代码之家  ›  专栏  ›  技术社区  ›  SoftwareGeek

Linq-通过标准获得前2条记录

  •  0
  • SoftwareGeek  · 技术社区  · 14 年前

    我有以下格式的数据:

    colA                colB
    2010                10
    2010                20
    2010                30
    1999                99
    

    我需要使用linq/lambda表达式获得如下输出:

    colA                colB
    2010                10
    1999                99
    

    colb可以是任何非99值,但是前2个应该总是列出99和任何非99值的1个实例。 我在追求可乐的价值观。

    蒂亚

    2 回复  |  直到 14 年前
        1
  •  1
  •   kbrimington    14 年前

    你想要这样的东西吗?

    var value1 = data.FirstOrDefault(x => x.colB != 99).Select(x => x.colA);
    var value2 = data.FirstOrDefault(x => x.colB == 99).Select(x => x.colA);
    

    可以组合成 IEnumerable 使用实用方法,如以下扩展名:

    public static void CreateEnumerable<TResult>(this TResult obj)
    {
        yield return obj;
    }
    

    以这样的方式:

    var results = value1.CreateEnumerable().Concat(value2.CreateEnumerable());
    
        2
  •  1
  •   Travis Heseman    14 年前

    您将要学习如何使用groupby()分组;转到 101 LINQ Samples: Grouping Operators .

    public class Record
    {
        public int colA; { get; }
        public int colB; { get; }
    }
    
    ...
    // this extension method will clean up our searching within the group clause
    public static Record Select99OrFirst(this IEnumerable<Record> source)
    {
        var item = source.FirstOrDefault(r => r.colB == 99);
        return (null != item) ? item : source.First();
    }
    
    ...
    
    IEnumerable<Record> data;
    var query = data.GroupBy(r => r.colA)
      .Select(g => new { Year = g.Key, Value = g.Select99OrFirst().colB })
      .OrderByDescending(x => x.Year);
    
    Console.WriteLine("colA/tcolB");
    foreach (var item in query)
        Console.WriteLine(item.Year + "/t" + item.Value);
    
    

    这将为您提供匿名对象,分别具有cola和colb的Year属性和Value属性。如果在一年组中找不到99条记录,则每个记录都代表该组中的第一条记录。