반응형
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);
}
일반화 설명은 생략...🥱😴
반응형