2010-07-16 8 views
8

나는 F #으로 시작하고 사전을 반복하여 키와 값을 가져 오려고합니다. 사전을 통한 F # 반복

그래서 C#으로, 내가 넣어 것 :

IDictionary resultSet = test.GetResults; 
foreach (DictionaryEntry de in resultSet) 
{ 
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); 
} 

내가 (안 하나 어쨌든 컴파일이) F #으로이 작업을 수행 할 수있는 방법을 찾을 수 없습니다.

누구나 F #에서 해당 코드를 제안 할 수 있습니까?

건배,

호감

답변

2
resultSet |> Map.iter (fun key value -> 
    printf "Key = %A, Value = %A\n" key value) 
+0

호기심 - 궁금한 점은 printfn이 아니라 문자열 끝에 \ n이있는 printf가 필요한 이유일까요? –

+0

'printfn'을 볼 때마다 반대 질문을합니다. 이유는 없지만 물론 개인적인 취향입니다. –

18

하여 사전의 유형은 무엇입니까?

는 다음 시도 제안 당신의 코드로 IDictionary 제네릭이 아닌 경우 다음 (당신은 당신이 쉽게 작업 할 수있는 입력 집합을 얻을 수 Seq.cast<>를 추가해야하므로 F 번호에 for는 암시 적으로 변환을 삽입하지 않습니다) :

for entry in dict do 
    // use 'entry.Value' and 'entry.Key' here 
:

for entry in dict |> Seq.cast<DictionaryEntry> do 
    // use 'entry.Value' and 'entry.Key' here 

당신이 라이브러리에 대한 제어가있는 경우 다음 (Seq.cast에 대한 호출을 필요로하지 않는 일반 IDictionary<'K, 'V>를 사용하는 경우, 이것은) 이전 옵션보다 낫다 0

불변의 F # Map<'K, 'V> 유형 (F #에 기능 코드를 작성하는 경우 사용할 수있는 최상의 유형)을 사용하는 경우 Pavel의 솔루션을 사용하거나 for 루프를 KeyValue 활성 패턴과 함께 사용할 수 있습니다 이 : 사례 모두에서

for KeyValue(k, v) in dict do 
    // 'k' is the key, 'v' is the value 

, 당신은 하나 for 또는 다양한 iter 기능을 사용할 수 있습니다. 부작용이있는 무언가를 수행 할 필요가 있다면 for 루프를 선호 할 것입니다. (그리고 이것은 제가 언급 한 첫 번째 대답이 아닙니다 :-)) 이것은이 목적으로 설계된 언어 구조이기 때문입니다. 함수 처리를 위해서는 Seq.filter 등의 다양한 함수를 사용할 수 있습니다.

+0

부작용이있는 메서드 * (함수?) *에 대한 루프 호출이 좋습니다. – ChaosPandion

+3

그러나'iter'의 전체적인 요지는 부작용 (유형에 의해 입증 됨)을 수행하는 것입니다. 그래서 이것은 또한 "목적을 위해 설계된 것"입니다. ('for '가 열등하다고 말하는 것이 아니라, 물론, 사실 'KeyValue'에 대해 알지 못했습니다.) –

+0

@Pavel : 예, iter는이 목적으로 설계되었습니다. 그러나 필자의 인상은'iter'는 OCaml에서 상속 받았으며, F # 방식은'for'를 사용하는 것입니다 (이것은 아마도 개인적인 취향 일 것입니다). 일반적으로 언어 구조가 적합한 곳에서 뭔가를하고 있다면 언어 구조가 라이브러리 함수보다 선호된다고 생각합니다. –