2009-11-13 6 views
5

Dictionary<int, MyTableClass>에서 MyTableClass가 Field<F1, F2, F3>을 상속하는 첫 번째 값을 찾는 방법은 무엇입니까? 사전에있는 첫 번째 값을 반환하는 Property 또는 Property/Method 조합을 선호합니다. F1 = MyEnum.value.사전에서 '첫 번째'값을 찾는 방법은 무엇입니까?

내가 원하지 않는 것은 foreach입니다. 성능면에서는 이것이 바람직한 방법은 아닙니다.

+4

성능 측면에서 LINQ 등 여기서 할 수있는 모든 것은 사전 키를 조회하지 않기 때문에 'foreach'보다 빠르지 않습니다. 핵심 조회 만 빠릅니다. 다른 경우 선형 스캔을 수행해야합니다 (또는 다른 키에 대한 두 번째 사전을 유지 관리해야합니다. 조회는 무엇이든 가능합니다). –

+0

@Pavel : 와우 ​​... 나는 거의 2 년 만에 많은 것을 배웠습니다. 나는 내가 지금 알고있는 것을 알고 있었으면 좋겠다. – IAbstract

답변

6

아무리 옷을 입혀도 상관 없지만 본질적으로 foreachDictionary 이상의 값으로 설정해야합니다. Dictionary<TKey,TValue>은 주어진 값에 대해 전체 키를 O (1) 액세스에 가깝게 제공합니다. 부분 키에 대한 효율적인 액세스를 제공하도록 설계되지 않았습니다. 이를 얻으려면 두 번째 Dictionary 인스턴스가 적절한 매핑을 유지해야합니다.

2

.First() 확장 메서드를 사용할 수 있습니다.

+0

. 무엇에 First()? Dictionary obj에 해당 메소드가 없습니다. –

+0

은 대답에 더 많은 컨텍스트를 추가 할 수 있다면 도움이 될 것입니다. –

+0

확장 메서드이므로 System.Linq를 가져 오는 경우에만 볼 수 있습니다. – maxpower47

6

일부 기준과 일치하는 값을 찾는 가장 짧은 방법은 (특히 내가 원하는 것을 이해할 수 없습니다. 먼저 F1은 제네릭 형식 매개 변수이며 ==을 사용하여 값인 것처럼 비교합니다. .)이 작업을 수행하는 것입니다

dictionary.Values.First(x => ...); 

...x에 부울 표현 될 곳. 그러나 사전 키 조회를 수행하지 않으므로이 작업은 foreach보다 빠릅니다. 핵심 조회 만 빠릅니다. 다른 경우 선형 스캔을 수행해야합니다 (또는 다른 키에 대한 두 번째 사전을 유지 관리해야합니다. 조회는 무엇이든 가능합니다).가 [코멘트에서 복사]

5

사전은 요소 사이의 특정 순서를 유지하지 않기 때문에 당신이 어떤 순서를 지정하지 않는 한 최초의 하나가 될 수있는 요소가 정말 없다.

당신은 사전에이 같은 찾을 발생하는 첫 번째 항목을 얻을 수 있습니다 :

MyTableClass one = dict.Where(pair => pair.Value.F1 == MyEnum.value).First(); 

이 것 항목을 통해 단지 루프 그냥 목록으로 사전을 사용하고 그래서, 일치하는 항목을 찾을 때까지. 퍼포먼스가 필요하다면, F1의 값이 키가되는 사전을 가져야합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 foreach가 내가 원했던 것을 할 수있는 유일한 방법이 될 것이라고 거의 확신했다 - 그러나 누군가 내가 생각하지 못했던 아이디어가 있는지보기를 원했다. :) – IAbstract

관련 문제