61093


お世話になります。  
C#で下記のコードのように独自のクラスを作り、それをリストに追加しています。

[code]

    public class person(){
    public int id {get;set;}
    public string name {get;set;}
    public int age {get;set;}
    }
    
    (中略)
    
    List<person> p = new List<person>();
    p.Add(new person(){
    id = 1,
    name = "テスト",
    age = 20,
    });
    
    p.Add(new person(){
    id = 2,
    name = "f",
    age = 21,
    });
    
    p.Add(new person(){
    id = 3,
    name = "c",
    age = 23,
    });
    
    p.Add(new person(){
    id = 4,
    name = "サンプル",
    age = 20,
    });
    
[/code]

このようなリストで次のような操作を行いたいのですが、何かよい方法はないでしょうか。

  * リストから「name」部分を取り出して、文字列の配列にする。  
「p.ToArray();」ではエラーになるため、現在は下記のような感じでforeachで回していますが、簡単な方法があれば、教えてください。

[code]     List<string> name_list = new List<string>();

    foreach (person i in p){
    name_list.Add(i.name);
    }
    name_list.ToArray();
    
[/code]

  * 作成したリストを「name」をキーにして昇順にソートしたいのですが、どうしたらいいでしょうか。

以上、よろしくお願いいたします。


CC BY-SA 4.0
2019-12-04T05:56:44.313
61085
2019-12-04T09:29:10.800
2019-12-04T08:47:00.223
32986
29034
question
c#
C#での独自クラスのリストの操作について


簡単かどうかは疑問ですが、LINQの ~~[SelectManyメソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.selectmany?view=netframework-4.8) と~~
[Selectメソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.select?view=netframework-4.8)
を使えば1行で出来ます。  
旧冗長な回答：  
~~string[] name_list = new[] { p }.SelectMany(list => list.Select(entry =>
entry.name)).ToArray();~~

⇒生兵法は怪我の元ですね。少ない経験で応用しようとしてイマイチな内容でした。@mok2pok さん回答のように以下にしたかったのですが。

[code]

    string[] name_list = p.Select(entry => entry.name).ToArray();
    
[/code]

ソートの方は、リスト自身をソートするなら、Listクラスの [Sortメソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.collections.generic.list-1.sort?view=netframework-4.8) を：

[code]

    p.Sort((a, b) => string.Compare(a.name, b.name));
    
[/code]

元のリストはそのままにして、ソートした結果を別に受け取るならLINQの
[OrderByメソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.orderby?view=netframework-4.8)
を使うのが良いようです：

[code]

    List<person> q = p.OrderBy(n => n.name).ToList();
    
[/code]

`name`の抽出・文字列配列化と、リストを`name`でソートするのは別々の要求と考えました。

参考  
[【C#】自作クラスのListのソート](https://qiita.com/tetsu8/items/96b8b889c57eb55125d1)  
[自作クラスによる配列をソート（並べ替え）するには？（LINQ版）［3.5、C#、VB］](https://www.atmarkit.co.jp/fdotnet/dotnettips/880orderby/orderby.html)  
[C#でラジオボタンの複数のグループボックスのチェック状態を全て取得したいです。](https://ja.stackoverflow.com/q/56795/26370)


CC BY-SA 4.0
2019-12-04T08:06:05.200
61093
2019-12-04T09:29:10.800
2019-12-04T09:29:10.800
26370
26370
61085
answer


リストから「name」部分を取り出して、文字列の配列にする簡単な方法は、ちょっとわかりませんが。  
自作クラスのソート方法は、下記を参考にしてみてください。  
<https://qiita.com/tetsu8/items/96b8b889c57eb55125d1>


CC BY-SA 4.0
2019-12-04T08:12:26.063
61094
2019-12-04T08:12:26.063
24490
61085
answer


昇順にソートされた`name`文字列の配列がほしいなら、

[code]

    string[] array = p
        .Select(e => e.name)    // nameだけ取り出して
        .OrderBy(name => name)  // ソートして
        .ToArray();             // 配列に変換
    
[/code]

元のリスト`p`を`name`で昇順ソートした新しいListが欲しい（元の`p`はソートされない）なら、

[code]

    List<person> sortedList = p
        .OrderBy(e => e.name)  // nameでソートして
        .ToList();             // Listに変換
    
[/code]


CC BY-SA 4.0
2019-12-04T08:50:43.333
61097
2019-12-04T08:50:43.333
8078
61085
answer