2016-06-27 75 views
0

我遍历一个充当数据结构的对象。该结构只是一个包含KeyPairValue的列表,我想知道在使用foreach循环时是否可以获取Value。更改foreach返回值

+0

某些代码可能帮助解释你想要的。 – hatchet

+1

'myKeyValuePair.Value' –

+1

不,你不能告诉'foreach'这么做 - 但是你可以使用linq'Select'语句来处理列表,然后用'foreach'遍历它:'foreach(var值在mylist.Select(t => t.Value))' – Blorgbeard

回答

1

您可以实现这样的事情

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

可以在实际类型K和V代替,或者看到一个小的改动意见,使一个通用的功能。

+1

你应该修复它:'var kv in list',你还有另一个问题,它应该是'EnumerateValues (List > list)' –

+0

此外,为什么不使用'IEnumerable'而不是'List',所以它会更通用。 –

+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(); 
} 

(我敢肯定,很多人都已经知道这一点,但这样我想我可能也只是万一别人拓展我无法找到任何有类似的问题。)