リストの要素によるソート(OrderBy)と、任意の数の割り当てについて


フルーツの分配プログラムを作っています。

リストの扱い方、リスト内の要素によるリストのソートの仕方が不明です。それができたら、リスト内の各アイテムにループによって、任意の数を一つずつ振り当てていくということがしたいです。

  * リストは、人名と年齢についての情報が入っています(氏 + 名 + 年齢)で、ユーザー入力によりリスト追加されます。（氏名と年齢にわけて多次元配列にしたほうがスマートなのでしょうか？）
  * リストを年齢でソートしたいです
  * 任意の入力数を、リスト内の情報に順番に加えていきたいです。(割り算による同じ数の分配ではなく、ループでフルーツがなくなるまで一つずつ順番に分配するイメージ)

### コード

[code]

    List<string> names = new List<string>();    
    private void BtnDivide_Click(object sender, RoutedEventArgs e)
    {
        int nrOfFruits = int.Parse(TxtTotalFruits.Text);
        int c = names.Count;
        int division;
        string firstName = TxtFirstName.Text;
        string lastName = TxtLastName.Text;      
        string txtAge = TxtAge.Text;           
    
        // 割り算で平等に分配すると場合により余剰がでるので、最終的には商を出すのではなく、ループで最後の一つまで分配したいです。
    
        division = nrOfFruits / c;
    
        for (int i = 0; i < c; i++)
        {
            // リスト内の年齢の要素を使って昇順にソートしたいです。
    
            //Lambda operator: => 
    
            //OrderByを使う？
            var orderedNames = names.OrderBy(txtAge => names);
    
            //wpf上のリストボックスNameListとorderedNamesを繋ぐ
            NameList.Items[i] = orderedNames;
    
            //希望の順番でリストをソートできたところで、wpf上のリストボックスに数を表示させる。
    
            NameList.Items[i] += " " + division.ToString() + " 個のフルーツ";
        }
    }
    
[/code]




> 氏名と年齢にわけて多次元配列にしたほうがスマートなのでしょうか？

データ構造は、アクセスしやすいようにクラスや構造体で定義したほうが良いです。

[code]

        public class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int Age { get; set; }
            public int Fruits { get; set; }
        }
    
[/code]

OrderByの引数は、要素からソートで使うキーを抽出する関数を指定します。下記の例ではラムダ式で記述しています。

[code]

        private void SortAndDistributeFruits(List<Person> persons, int fruits)
        {
            // 年齢でソート
            var orderedPersons = persons.OrderBy(e => e.Age).ToList();
    
            // ループでフルーツがなくなるまで一つずつ順番に分配する
            for (int i=0; i<fruits; i++)
            {
                // 人数で割った余りで誰に配るかを決める
                var index = i % orderedPersons.Count;
    
                // 1つ配る
                orderedPersons[index].Fruits++;
            }
        }
    
[/code]

OederByより返されるリストは元のリストとは別なものです。もし元のリスト自体の並び順を変えたいのなら`Sort`メソッドを使用する方法もあります。

