web-dev-qa-db-ja.com

LINQを使用した複数注文

まず、LINQを使用してリストで操作する基本クラスから始めます。次のようなものです。

public class FooBar   
{  
    public virtual int Id { get; set; }  
    public virtual string Foo{ get; set; }  
    public virtual string Bar{ get; set; }
}

これは、非ラムダLINQを使用して問題を解決するために最終的に見つけたものです。

// code somewhere else that works and gets the desired results  
var foobarList = GetFooBarList();  // Abstracted out - returns List<Foobar>  

// Interesting piece of code that I want to examine
var resultSet = from foobars in foobarList  
                orderby foobars.Foo, foobars.Bar  
                select foobars;

// Iterate and do something interesting  
foreach (var foobar in resultSet)  
{  
    // Do some code  
}

私が本当に興味を持っているのは、同じことを実現するために、汎用IEnumerableのLambdaベースの拡張メソッドを使用して同じことが実現できるかどうかです。 Googleはそれを達成するために次のようなことができると言っています

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar})  
                          .Select(x=>x);

しかし、それを行うと、foreachステートメントをヒットしたときにランタイムエラーが発生します。このエラーは、少なくとも1つのオブジェクトがIComparibleを実装する必要があることを示しています。これは、.OrderBy()メソッドに匿名型を使用しているため、それを見ることができます。

だから私はラムダの方法を使用して欲しいものを達成する方法がありますか?

206
sdanna

ThenBy および ThenByDescending 拡張メソッドを使用できます。

foobarList.OrderBy(x => x.Foo).ThenBy( x => x.Bar)
480
Pop Catalin