将 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&lt;T&gt; - 只是Linq 提供了一些方便的方法,例如ToListToArrayToDictionary,它们隐藏了foreach - 但它仍然存在。 另外,您实际上想要完成什么? 我有一个List 和一个Dictionary (List&lt;Dictionary&lt;string, string&gt;&gt;),每个Dictionary 只包含一对。我想我错误地使用了这个功能:( 由于每个字典中只有一个配对,我想从字典中取出KeyValue 并分配给一个变量。 【参考方案1】:

我有一个字典列表 (List&lt;Dictionary&lt;string, string&gt;&gt;),每个字典只包含一对。

如果您想要更简洁的内容,则需要编写自己的扩展方法。下面的方法还将 legacy KeyValuePair&lt;K,V&gt; 结构转换为 ValueTuple&lt;K,V&gt;,由于解构,它更有用:

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&lt; Dictionary&lt;K,V&gt; &gt;,这种情况下你仍然可以使用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&lt;String,String&gt;,那么您可以在 3 行中完成:

Dictionary<String,String> output = listOfSingleElementDictionaries
    .Select( d => d.UnwrapSingle() )
    .ToDictionary( t => t.key, t => t.value );

【讨论】:

感谢您的详细解释。最后我使用了UnwrapSingle的扩展方法。欣赏!【参考方案2】:

如果你的字典里只有一对像Dictionary&lt;string, string&gt; paring = new Dictionary&lt;string, string&gt;();那么你可以实现下面的代码,

var result = paring.ToDictionary(s => s.Key, s => s.Value);
var key = result.Single().Key;
var value = result.Single().Value;

如果你有一对像List&lt;Dictionary&lt;string, string&gt;&gt; listOfDictionary = new List&lt;Dictionary&lt;string, string&gt;&gt;(); 这样的字典列表,那么你可以这样做,

var result = listOfDictionary.ToDictionary(s => s.Keys.Single(), s => s.Values.Single());

当字典列表中有大量数据时,可以通过这种方式优化性能。

【讨论】:

以上是关于将 KeyValuePair ForEach 转换为 LINQ的主要内容,如果未能解决你的问题,请参考以下文章

使用KeyValuePair迭代C#字典

Foreach 对象循环

KeyValuePair的使用

在 LINQ 查询中将 KeyValuePair 转换为匿名类型

Dictionary的遍历总结

Parallel.ForEach 具有可枚举的 KeyValuePairs?