【C#】LINQとString.Join()を使ってリストの要素をいいかんじに加工したものをつなげた文字列を表示する!

プログラミング

ども、村正です!

今回はLINQとString.Join()を使って「リストの各要素を加工したものをつなげた文字列を作って表示する」方法について紹介していきます。

やりたいこと

以下の3つのプロパティを持つUserクラスがあります。

  • int型 ID(例:2)
  • String型 名前(例:ひよこ)
  • int型 年齢(例:7)

このクラス型の要素を持つUsersリストを使って、以下のように表示したいと思っています。

ID:1 名前:たまご 年齢:0
ID:2 名前:ひよこ 年齢:7
ID:3 名前:にわとり 年齢:24

ユーザーごとの情報を1行ずつ表示していくわけですが、そのとき「ID:2」のように何の情報なのかという文字列をつけるといった感じです。

LINQやString.Join()を使わずに書いてみる

まずはLINQもString.Join()も使わずに書いてみましょう。

/// <summary>
/// ユーザー情報を表します
/// </summary>
public class User
{
    /// <summary>
    /// IDを取得・設定します
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 名前を取得・設定します
    /// </summary>
    public string Name { get; set; }
    
    /// <summary>
    /// 年齢を取得・設定します
    /// </summary>
    public int Age { get; set; }

    /// <summary>
    /// 新しいユーザーを作成します
    /// </summary>
    /// <param name="id"></param>
    /// <param name="userName"></param>
    /// <param name="age"></param>
    public User(int id, string name, int age)
    {
        this.Id = id;
        this.Name = name;
        this.Age = age;
    }
}
public class Program
{
    static void Main(string[] args)
    {
        // コーザーリストの作成
        var Users = new List<User>
        {
            new User(1, "たまご", 0),
            new User(2, "ひよこ", 7),
            new User(3, "にわとり", 24)
        };

        // 出力文字列の作成
        var outputString = new StringBuilder();
        foreach (var user in Users)
        {
            outputString.Append($"ID:{user.Id} 名前:{user.Name} 年齢:{user.Age}\r\n");
        }

        // コンソール画面に表示
        Console.Write(outputString.ToString());
    }
}

ID:1 名前:たまご 年齢:0
ID:2 名前:ひよこ 年齢:7
ID:3 名前:にわとり 年齢:24

もちろんこれでもよいのですが、出力用の文字列(StringBuilder型の変数outputString)を作らないいけないのはムダな感じがします。あともう少し行数を減らしたい!

LINQとString.Join()を使ってみる

先ほどのコードの改善点は以下の通りです。

  • 出力文字列用に変数を用意している(StringBuilder型の変数outputString)。
  • foreachで3行使ってしまっている。

これはLINQとString.Join()を使うことで改善することができます。

そんなこんなで改善したコードは以下の通りです。

public class Program
{
    static void Main(string[] args)
    {
        // コーザーリストの作成
        var Users = new List<User>
        {
            new User(1, "たまご", 0),
            new User(2, "ひよこ", 7),
            new User(3, "にわとり", 24)
        };

        // コンソール画面に表示
        Console.Write(String.Join(
            String.Empty,
            Users.Select(x => $"ID:{x.Id} 名前:{x.Name} 年齢:{x.Age}\r\n").ToArray()));
    }
}

ID:1 名前:たまご 年齢:0
ID:2 名前:ひよこ 年齢:7
ID:3 名前:にわとり 年齢:24

16行目でLINQを使って、Usersリストの各要素の値を使った出力用の文字列(「ID:○○ 名前:△△ 年齢:××」)リストを作成しています。ちなみに各ユーザーの情報を1行ずつ表示したいので、末尾に改行文字(\r\n)をつけています。

14行目でString.Joinメソッドを使って、LINQを使って作成したリストの各要素を空文字(String.Empty)で結合し、コンソール画面に表示しています。

これにより、出力文字列用の作るためだけにわざわざ変数を用意する必要はなくなり、簡潔に書くことができました!

まとめ

LINQとString.Join()を使うことで、無駄なローカル変数をなくし簡潔なコードを書くことができます。

今回はリスト(List<T>)についてのコードを紹介しましたが、配列やコレクションでも同じように使えるはずです!

でも…C#を勉強したての新人プログラマーにはちょっと難しくない…?

■LINQとString.Join()を使わない記述

var outputString = new StringBuilder();
foreach (var user in Users)
{
    outputString.Append($"ID:{user.Id} 名前:{user.Name} 年齢:{user.Age}\r\n");
}

Console.Write(outputString.ToString());

■LINQとString.Join()を使う記述

Console.Write(String.Join(
    String.Empty,
    Users.Select(x => $"ID:{x.Id} 名前:{x.Name} 年齢:{x.Age}\r\n").ToArray()));

参考

■String.Join メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.string.join?view=net-8.0

コメント