C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でLINQを使用してコレクションの値を更新する方法

C#でコレクションの要素を更新したい場合、LINQの機能を活用するとコードを簡潔に記述できます。コレクションがList<T>型であれば、LINQに含まれるForEach拡張メソッドを利用するのが最も手軽な方法です。

ForEach拡張メソッドですべての要素を更新する

ForEach拡張メソッドは、リストの各要素に対して引数として渡したラムダ式の処理を実行します。以下の例では、リスト内のすべての果物(Fruit)オブジェクトのSizeプロパティを「Large」に一括で変更しています。

using System;
using System.Collections.Generic;

namespace DemoApplication {
   class Program {
      static void Main(string[] args) {
         List<Fruit> fruits = new List<Fruit> {
            new Fruit {
               Name = "Apple",
               Size = "Small"
            },
            new Fruit {
               Name = "Orange",
               Size = "Small"
            }
         };

         foreach(var fruit in fruits) {
            Console.WriteLine($"更新前の情報:{fruit.Name}, {fruit.Size}");
         }

         // ForEachですべての要素のSizeを「Large」に更新
         fruits.ForEach(fruit => { fruit.Size = "Large"; });

         foreach (var fruit in fruits) {
            Console.WriteLine($"更新後の情報:{fruit.Name}, {fruit.Size}");
         }

         Console.ReadLine();
      }
   }

   public class Fruit {
      public string Name { get; set; }
      public string Size { get; set; }
   }
}

実行結果

更新前の情報:Apple, Small
更新前の情報:Orange, Small
更新後の情報:Apple, Large
更新後の情報:Orange, Large

Where句で条件に合う要素だけを更新する

特定の条件を満たす要素のみを更新したい場合は、Where()メソッドと組み合わせます。Where句で条件に一致する要素を絞り込み、その結果に対してforeachループで値を書き換えます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace DemoApplication {
   class Program {
      static void Main(string[] args) {
         IEnumerable<Fruit> fruits = new List<Fruit> {
            new Fruit {
               Name = "Apple",
               Size = "Small"
            },
            new Fruit {
               Name = "Orange",
               Size = "Small"
            },
            new Fruit {
               Name = "Mango",
               Size = "Medium"
            }
         };

         foreach(var fruit in fruits) {
            Console.WriteLine($"更新前の情報:{fruit.Name}, {fruit.Size}");
         }

         // Sizeが「Small」の要素だけを更新
         foreach (var fruit in fruits.Where(w => w.Size == "Small")) {
            fruit.Size = "Large";
         }

         foreach (var fruit in fruits) {
            Console.WriteLine($"更新後の情報:{fruit.Name}, {fruit.Size}");
         }

         Console.ReadLine();
      }
   }

   public class Fruit {
      public string Name { get; set; }
      public string Size { get; set; }
   }
}

実行結果

更新前の情報:Apple, Small
更新前の情報:Orange, Small
更新前の情報:Mango, Medium
更新後の情報:Apple, Large
更新後の情報:Orange, Large
更新後の情報:Mango, Medium

この例では、Sizeが「Small」である果物だけを抽出して値を更新しています。このようにWhere句を使えば、条件に基づいて対象のレコードをフィルタリングしながら更新できます。

なお、IEnumerable<T>インターフェースには標準のForEach拡張メソッドが用意されていないため、List以外のコレクションを扱う場合は、上記のようにWhere+foreachの組み合わせが有効です。また、LINQは遅延評価の仕組みを持つため、Whereの結果を明示的に具体化したい場合にはToList()などを併用するとよいでしょう。

まとめ

  • List<T>の全要素を一括更新するならForEach拡張メソッドが便利。
  • 条件に合う要素だけを更新する場合はWhere()で絞り込んでからforeachで処理する。
  • IEnumerable<T>にはForEachメソッドがないため、Where+foreachの組み合わせを活用する。
  1. C#で文字列の長さを取得する方法を解説!String.Lengthプロパティの使い方

    C#で文字列の長さを取得する基本 C#で文字列の長さ(文字数)を取得するには、String.Lengthプロパティを使用します。これは最もシンプルで一般的な方法です。 str.Length Lengthプロパティは、指定された文字列に含まれる文字数を計算して返します。例えば、文字列「Amit」の場合は4文字となるため、Lengthプロパティの戻り値は「4」になります。 string str = Amit; サンプルコード 以下は、C#で文字列の長さを計算して表示するプログラムの完全な例です。 using System; using System.Collections; namespace

  2. PythonとMySQL Connectorでテーブル内の特定の値を更新する方法を解説

    テーブル内のデータは時間の経過とともに古くなり、後から修正が必要になることがあります。たとえば、学生情報を管理するテーブルがあり、ある学生が引っ越したために住所が変わったとしましょう。この場合、誤ったデータが原因で将来トラブルが発生しないよう、データベース側の情報も忘れずに更新しておく必要があります。 MySQLでは「UPDATE」ステートメントを使ってテーブル内の値を更新します。SET句で列に設定する新しい値を指定し、WHERE句でテーブル内のどの行を更新対象とするかを特定します。 基本構文 UPDATE table_name SET column=new_value WHERE colum