2016-06-27 3 views
0

데이터 구조로 작동하는 객체를 반복합니다. 구조체는 KeyPairValue를 포함하는 목록 일 뿐이며 foreach 루프를 사용할 때 Value를 얻을 수 있는지 궁금합니다.foreach 반환 값 변경

+0

일부 코드 수도 원하는 것을 설명하는 데 도움이됩니다. – hatchet

+1

'myKeyValuePair.Value' –

+1

아니요, 당신은'foreach'에게 그렇게 할 수는 없지만'foreach'를 사용하여 반복하기 전에 linq'Select' 문을 사용하여리스트를 처리 할 수 ​​있습니다 : foreach (var 값은 mylist.Select (t => t.Value))' – Blorgbeard

답변

1

당신은 당신은 K와 V의 실제 유형에 대체 할 수있는이

public IEnumerable<V> EnumerateValues(IEnumerable<KeyValuePair<K, V>> list) 
{ 
    foreach (var kv in list) yield return kv.Value; 
} 

같은 것을 구현, 또는 일반적인 기능을 만들기 위해 작은 변화에 대한 코멘트를 볼 수 있습니다.

+1

'var kv in list'에 수정해야한다. 또 다른 문제가있다. 'EnumerateValues ​​ (List > list)' –

+0

또한 'List'대신에'IEnumerable'을 사용하지 않는 것이 더 일반적입니다. –

+0

@OrelEraki : 'var'로 잡아줘서 고마워. 나는 원래 자신이 구체적인 유형으로 들어가기를 원했고, 자신의 경험 수준에 따라 더 쉬울 수도 있습니다. 내 반응을 업데이트하여이를 알려주고 자신의 의견을 지적하여 일반화하도록 할 것입니다. –

0

Eric J의 답변을 확장하려면 사용자 정의 컬렉션의 작동 방식을 완전히 바꾸려면 몇 가지 작업을 수행 할 수 있습니다. 내 데이터 구조는 이미 비공개 목록을 보유하고 있으므로 값으로 전달할 필요가 없습니다. 다음은 컬렉션을 반복 할 때 상관없이 원하는대로 반환합니다.

public IEnumerable<V> EnumerateValues() 
{ 
    foreach (var kv in privateList) yield return kv.Value; 
} 
public IEnumerator<KeyValuePair<K, V>> GetEnumerator() 
{ 
    return EnumerateValues().GetEnumerator(); 
} 
IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 

(나는 확실히 많은 사람들이 이미 알고 있어요,하지만 난뿐만 아니라 단지 경우 다른 사람에 확장 할 수있다 내기 때문에 난 아무것도 찾을 수 없습니다 비슷한 문제가 있습니다.)