Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# LINQ로 컬렉션 값 업데이트하는 방법 (ForEach, Where 활용)

C# LINQ로 컬렉션 값 업데이트하기

C#에서 컬렉션의 요소 값을 수정해야 할 때, 컬렉션이 List<T> 타입이라면 ForEach 확장 메서드를 활용할 수 있습니다. 이 메서드는 각 요소에 대해 지정한 동작을 반복 실행해 주므로, 별도의 반복문을 작성하지 않고도 한 줄로 값을 업데이트할 수 있습니다.

예제 1: ForEach로 전체 요소 업데이트

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}");
            }

            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

실행 결과를 보면 리스트의 모든 과일이 Size 속성 값이 "Small"에서 "Large"로 변경된 것을 확인할 수 있습니다. ForEach 메서드에 전달한 람다 식이 각 요소에 대해 실행되기 때문입니다.

조건에 맞는 항목만 업데이트하기: Where() 활용

모든 요소가 아니라 특정 조건을 만족하는 항목만 업데이트하고 싶다면 Where() 연산자를 사용하면 됩니다. Where 절은 주어진 조건식에 따라 요소를 필터링하며, 필터링된 결과에 대해 속성을 변경하면 원본 컬렉션의 해당 객체만 수정됩니다.

예제 2: Where로 조건부 업데이트

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}");
            }

            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"인 과일만 골라서 "Large"로 변경했습니다. Mango는 조건에 해당하지 않으므로 기존 값인 "Medium"을 그대로 유지합니다. 이처럼 Where 절은 주어진 조건에 맞는 레코드만 걸러내는 필터 역할을 하며, LINQ의 지연 실행(lazy evaluation) 특성 덕분에 foreach 문과 결합했을 때 간결하고 읽기 쉬운 코드를 작성할 수 있습니다.

추가 팁

  • ForEachList<T> 타입에 제공되는 메서드이므로, IEnumerable<T> 인터페이스에는 직접 사용할 수 없습니다. 이 경우 예제 2처럼 foreach 문과 Where()를 조합하는 방식이 적합합니다.
  • LINQ는 기본적으로 데이터 조회(질의)를 위한 API이므로, 컬렉션을 변경하는 부수 효과(side effect)가 있는 로직은 ForEachforeach 문으로 처리하는 것이 좋습니다.