基本的に、オブジェクトのリストに対して一連の並べ替えを実行したい小さなプログラムがあります。各並べ替えは、オブジェクトの異なるプロパティで動作し、前の並べ替えによって生成された順序に従う必要があります。これが私がこれまでに持っているものです:
class Program
{
static void Main(string[] args)
{
List<Person> people = new List<Person>();
people.Add(new Person { Name = "John", Age = 43 });
people.Add(new Person { Name = "Ringo", Age = 73 });
people.Add(new Person { Name = "John", Age = 32 });
people.Add(new Person { Name = "Paul", Age = 38 });
people.Add(new Person { Name = "George", Age = 16 });
people.Add(new Person { Name = "John", Age = 80 });
people.Add(new Person { Name = "Ringo", Age = 22 });
people.Add(new Person { Name = "Paul", Age = 64 });
people.Add(new Person { Name = "George", Age = 51 });
people.Add(new Person { Name = "George", Age = 27 });
people.Add(new Person { Name = "Ringo", Age = 5 });
people.Add(new Person { Name = "Paul", Age = 43 });
Print(Sort(people));
}
static IEnumerable<Person> Sort(IEnumerable<Person> people)
{
//order by name first, then order by age
return people.OrderBy(p => p.Name).OrderBy(p => p.Age);
}
static void Print(IEnumerable<Person> people)
{
foreach (Person p in people)
Console.WriteLine("{0} {1}", p.Name, p.Age);
}
class Person
{
public string Name {get; set;}
public int Age { get; set; }
}
}
これにより、次の出力が生成されます。
リンゴ5 ジョージ16 りんご 22 ジョージ 27 ジョン 32 ポール 38 ジョン 43 ポール 43 ジョージ51 ポール 64 リンゴ73 ジョン 80
しかし、私はこの出力を生成したいと思います:
ジョージ16 ジョージ 27 ジョージ51 ジョン 32 ジョン 43 ジョン 80 ポール 38 ポール 43 ポール 64 リンゴ5 りんご 22 リンゴ73
言い換えれば、 で並べ替えてから、各「グループ」内でName
ローカライズされた順序付けを実行します。明らかに、これまでの方法ではこれは行われず、2 つのチェーンされた's' が実行されるだけです。Age
Name
Sort()
OrderBy
これを行う最善の方法は何IEnumerable
ですか? 理想的には、連鎖ソートを必要な数だけスケーリングおよびサポートするソリューションが必要です。各ソートは、次のソーターがそのソートをローカライズする必要がある一連の「グループ」を生成します。