문제
목록에서 무언가를 찾는 가장 좋은 방법은 무엇입니까?LINQ에 몇 가지 유용한 기능이 있다는 것을 알고 있지만 C# 2.0에 대한 제안도 살펴보겠습니다.이 일반적인 코드 패턴에 대한 최상의 리팩토링을 시도해 보겠습니다.
현재 다음과 같은 코드를 사용합니다.
// mObjList is a List<MyObject>
MyObject match = null;
foreach (MyObject mo in mObjList)
{
if (Criteria(mo))
{
match = mo;
break;
}
}
또는
// mObjList is a List<MyObject>
bool foundIt = false;
foreach (MyObject mo in mObjList)
{
if (Criteria(mo))
{
foundIt = true;
break;
}
}
해결책
@콘라드:그럼 어떻게 사용하나요?mo.ID를 MagicNumber와 일치시키고 싶다고 가정해 보겠습니다.
C# 2.0에서는 다음과 같이 작성합니다.
result = mObjList.Find(delegate(int x) { return x.ID == magicNumber; });
3.0은 람다를 알고 있습니다.
result = mObjList.Find(x => x.ID == magicNumber);
다른 팁
람다 표현식 사용:
List<MyObject> list = new List<MyObject>();
// populate the list with objects..
return list.Find(o => o.Id == myCriteria);
메소드에 코드를 넣고 임시 및 break
(그리고 보너스로 코드를 재활용합니다):
T Find<T>(IEnumerable<T> items, Predicate<T> p) {
foreach (T item in items)
if (p(item))
return item;
return null;
}
... 물론 이 방법은 .NET 2.0에도 목록에 대해 이미 존재합니다.
익명 대리인의 성능 저하가 상당히 심각한 것은 분명합니다.
테스트 코드:
static void Main(string[] args)
{
for (int kk = 0; kk < 10; kk++)
{
List<int> tmp = new List<int>();
for (int i = 0; i < 100; i++)
tmp.Add(i);
int sum = 0;
long start = DateTime.Now.Ticks;
for (int i = 0; i < 1000000; i++)
sum += tmp.Find(delegate(int x) { return x == 3; });
Console.WriteLine("Anonymous delegates: " + (DateTime.Now.Ticks - start));
start = DateTime.Now.Ticks;
sum = 0;
for (int i = 0; i < 1000000; i++)
{
int match = 0;
for (int j = 0; j < tmp.Count; j++)
{
if (tmp[j] == 3)
{
match = tmp[j];
break;
}
}
sum += match;
}
Console.WriteLine("Classic C++ Style: " + (DateTime.Now.Ticks - start));
Console.WriteLine();
}
}
결과:
Anonymous delegates: 710000
Classic C++ Style: 340000
Anonymous delegates: 630000
Classic C++ Style: 320000
Anonymous delegates: 630000
Classic C++ Style: 330000
Anonymous delegates: 630000
Classic C++ Style: 320000
Anonymous delegates: 610000
Classic C++ Style: 340000
Anonymous delegates: 630000
Classic C++ Style: 330000
Anonymous delegates: 650000
Classic C++ Style: 330000
Anonymous delegates: 620000
Classic C++ Style: 330000
Anonymous delegates: 620000
Classic C++ Style: 340000
Anonymous delegates: 620000
Classic C++ Style: 400000
모든 경우에 익명 대리인을 사용하는 것은 다른 방법보다 약 100% 느립니다.
제휴하지 않습니다 StackOverflow