将 KeyValuePair ForEach 转换为 LINQ
Posted
技术标签:
【中文标题】将 KeyValuePair ForEach 转换为 LINQ【英文标题】:Convert KeyValuePair ForEach to LINQ 【发布时间】:2021-06-05 23:18:55 【问题描述】:我有以下KeyValuePair
Dictionary<string,string>
格式。
因为它总是被解析为一对,所以foreach
不是必需的。但是,我无法在不导致语法错误的情况下删除它。
请问foreach
是否可以删除,也可以转换为LINQ
语法?
string key = "";
string value = "";
foreach (KeyValuePair<string, string> kvp in pairing)
Console.WriteLine("Key = 0, Value = 1",
kvp.Key, kvp.Value);
谢谢。
【问题讨论】:
困惑:你的字典里只有一个KVP?那你为什么要一本字典呢? "因为它总是被解析为一对,所以foreach
不是必需的。" - 你这是什么意思?您需要一个foreach
来实际枚举任何IEnumerable<T>
- 只是Linq 提供了一些方便的方法,例如ToList
、ToArray
和ToDictionary
,它们隐藏了foreach
- 但它仍然存在。
另外,您实际上想要完成什么?
我有一个List
和一个Dictionary
(List<Dictionary<string, string>>)
,每个Dictionary
只包含一对。我想我错误地使用了这个功能:(
由于每个字典中只有一个配对,我想从字典中取出Key
和Value
并分配给一个变量。
【参考方案1】:
我有一个字典列表 (
List<Dictionary<string, string>>
),每个字典只包含一对。
如果您想要更简洁的内容,则需要编写自己的扩展方法。下面的方法还将 legacy KeyValuePair<K,V>
结构转换为 ValueTuple<K,V>
,由于解构,它更有用:
public static class MyExtensions
public static ( TKey key, TValue value ) UnwrapSingle<TKey,TValue>( this IReadOnlyDictionary<TKey,TValue> dict )
var kvp = dict.Single();
return ( kvp.Key, kep.Value );
那么你可以这样做:
( String key, String value ) = paring.UnwrapSingle();
Console.WriteLine( key );
Console.WriteLine( value );
我刚刚看到你说它实际上是List< Dictionary<K,V> >
,这种情况下你仍然可以使用UnwrapSingle
,像这样:
List< Dictionary<String,String> > listOfSingleElementDictionaries = ...
foreach( Dictionary<String,String> dict in listOfSingleElementDictionaries )
( String key, String value ) = paring.UnwrapSingle();
Console.WriteLine( key );
Console.WriteLine( value );
如果您想将它们全部展平为单个输出 Dictionary<String,String>
,那么您可以在 3 行中完成:
Dictionary<String,String> output = listOfSingleElementDictionaries
.Select( d => d.UnwrapSingle() )
.ToDictionary( t => t.key, t => t.value );
【讨论】:
感谢您的详细解释。最后我使用了UnwrapSingle
的扩展方法。欣赏!【参考方案2】:
如果你的字典里只有一对像Dictionary<string, string> paring = new Dictionary<string, string>();
那么你可以实现下面的代码,
var result = paring.ToDictionary(s => s.Key, s => s.Value);
var key = result.Single().Key;
var value = result.Single().Value;
如果你有一对像List<Dictionary<string, string>> listOfDictionary = new List<Dictionary<string, string>>();
这样的字典列表,那么你可以这样做,
var result = listOfDictionary.ToDictionary(s => s.Keys.Single(), s => s.Values.Single());
当字典列表中有大量数据时,可以通过这种方式优化性能。
【讨论】:
以上是关于将 KeyValuePair ForEach 转换为 LINQ的主要内容,如果未能解决你的问题,请参考以下文章