2011-12-28 4 views
2

나는 람다에 익숙하지 않고 좀 더 복잡한 것을 시도 할 때까지는 꽤 똑바로 보였다. 나는이 사전을 가지고있다.C#의 람다 식 이해하기

이 중 가장 큰 값을 갖는 키 - 발 쌍의 키를 얻고 싶습니다. 내가 시도하는 것입니다 :

dict.Keys.Max(g => dict[g]) 

키 목록에서 해당되는 추론,하는 DICT 최대 규모의 [키]는 그 중 하나를 선택하십시오. 그러나 이것은 해당 키가 아닌 가장 큰 값 자체를 선택합니다.

+1

글쎄, 그것은하지 실제 코드, 당신 '이다 2 단 발췌 문장의 왼쪽에 뭔가를 넣어야합니다. 앞서 나갈 수 있도록 과제를 만드십시오. * var * 키워드는 좋습니다. –

+1

당신이 나를 오해하고있는 것처럼 보이기 때문에 나는 더 구체적으로 설명 할 것입니다 : 사전에있는 모든 값 중 가장 큰 값을 가진 키 - 값 쌍으로부터 키의 값으로 평가할 식을 찾고 있습니다. 나는 이것이 이것을 약간 더 분명하게하기를 바란다. – martixy

답변

1
var maxValue = dict.Max((maxPair) => maxPair.Value); 
var maxPairs = dict.Where((pair) => pair.Value == maxValue); 

이렇게하면 최대 값을 가진 모든 쌍의 목록을 얻을 수 있습니다. 그냥 키를 원하는 경우

, 당신은 나중에이 작업을 수행 할 수 있습니다 내가 맥케이에 내 생각을 기반으로 답변을 추가하기로 결정

var maxKeys = maxPairs.Select((pair) => pair.Key); 
+0

다른 제안 된 답변의 정렬 절차가 필요 없으므로 상당히 빠를 것이라고 가정하여 정답입니다. 지금까지 생각한 최상의 솔루션. – martixy

+0

이 방법은 키 목록을 두 번 반복해야하므로'MaxBy'가 더 빠릅니다. – recursive

+0

@martixy 예, 순서는 O (n log n)이며,이 패턴은 O (n)입니다. – McKay

0

dict.OrderBy(v => v.Value).Last().Key;

그것을해야한다. 기본적으로 값으로 KeyValuePair을 주문하고 최대 값이 될 마지막 값을 선택합니다. 그리고 마지막 하나에서 당신은 키에만 관심이 있습니다.

+2

OP는 가장 큰 값이 아니라 가장 큰 값에 해당하는 키를 원합니다. 당신은'dict.Values.Max()'를 썼을지도 모른다. –

+0

@EdS. 너무 빨리 응답했습니다. 지금 바로 수정하십시오 –

+0

쉽게 실수하세요; 나는 항상 그렇게한다. –

6

dict.Keys.OrderByDescending(g => dict[g]).First() 원하는대로 수행되지만 큰 사전에는 비효율적 일 수 있습니다. John Skeet의 MaxBy에있는 MoreLinq은 효율적으로 원하는 작업을 정확하게 수행합니다.

1

. 이 단지 키 제공, 표준 LINQ 방법 주어진 매우 빠르게 수행합니다 영업 이익은 단지 하나의 키 (NO 중복 값) 후 개선이 항상 있다는 것을 알고 있다면, 지금

var maxValue = dict.Max(p => p.Value); 
var keys = dict.Where(p => p.Value == maxValue).Select(p => p.Key); 

를 (아주 작은) 것 먼저 최대 값을 찾기 위해 평가 된 모든 후에 평가 될 수있는 최대 값을 가진 하나까지이 게으른 평가로 인해에만 요소 First을 사용 :

var key = dict.Where(p => p.Value == maxValue).First().Key; 
+0

중복 된 값이 없다면 개선되었지만 어쨌든 원하는 결과 일 수 있습니다. 최대 값을 갖는 모든 키, 최대 값을 갖는 키 중 하나만 갖고 있어도 상관하지 않을 수 있습니다. 그래서이 솔루션은 당신이 원하는 것일 수 있습니다. 나는 일반적으로 그렇게하는 것이 잘못되었다고 생각합니다. 내 코드 (및 코드의 첫 번째 부분)는 최대 값만 계산하고 나중에 키 값을 찾게됩니다. 어쩌면 당신은 첫 번째를 원할 것입니다, 아마도 당신은 카운트를 원할 것입니다, 아마도 당신은 그것들을 모두 화면에 인쇄하고 싶을 것입니다. 목록에 쿼리 할 수 ​​있습니다. – McKay