문제

목록에서 무언가를 찾는 가장 좋은 방법은 무엇입니까?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% 느립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top