PC&웹/VS프로그래밍

C#, ForEach 확장 메서드 사용하기

Simulz™ 2023. 5. 4. 22:34
반응형
e(item) => { e.Width = lookUpEdit.Height / 2; }

어떤 Object가 가지고 있는 Collection의 배열 값을 한 줄로 수정하기

위와 같은 DevExpress ~Edit에 ButtonEdit를 사용했을 때, 버튼의 폭을 변경하려면 Width 값을 버튼마다 적용해야 한다.

1. foreach 반복문은 직접 수정이 안 되므로, 새 개체의 인스턴스를 만들고 새로운 값으로 할당하고 원래 개체에 대입하고 여러 줄을 사용하므로 지저분하다. 

2. Select 등의 LINQ도 값을 변경 후 다시 대입해야 한다.

3. ConvertAll은 ToList로 변환해야 한다.

간편하게 한 줄로 처리하고 싶다.

일단 아래처럼 확장 메서드를 만들고 아무 파일 이름으로 저장한다.

namespace System.Collections.Generic
{
    public static class System
	{
		public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
		{
			foreach (TSource item in source)
			{
				action(item);
			}
		}
	}
}

사용할 참조와 동일한 namespace를 지정하면 using을 따로 사용할 필요가 없다.

ForEach를 적용할 개체의 형식을 TSource로 일반화한다.
IEnumerable<TSource> 개체에만 확장 메서드가 적용된다.
Action<TSource>는 사용자 정의 코드를 사용할 수 있다.

 

사용 예제

using System.Collections.Generic;
...
lookUpEdit.Properties.Buttons.ForEach(e => { e.Width = lookUpEdit.Height / 2; });

한 줄 끝.

 

분석

확장 메서드의 foreach 문에 의해 Buttons 개체의 컬렉션 수만큼 반복을 한다. 그러면서 action(item)이 실행되는데,

이는 사용자가 지정한 람다식이 action에 대입되므로 아래와 같다.

Action<EditorButton> action = e => { e.Width = lookUpEdit.Height / 2; }; // 정의

foreach(var blah in lookUpEdit.Properties.Buttons)
{
	action(blah); // 사용
}

ACTION을 메서드로 나타내면,

void action(EditorButton e) => e.Width = lookUpEdit.Height / 2;

기본 서식으로 풀어보면,

void action(EditorButton e)
{
	e.Width = lookUpEdit.Height / 2;
}

foreach(var blah in lookUpEdit.Properties.Buttons)
{
	action(blah);
}

일반화 설명은 생략...🥱😴

반응형