LINQ:IEnumerable <KeyValuePair <SomeType,IEnumerable <OtherType >>>选择

epi*_*tka 5 linq

我如何将其IEnumerable<KeyValuePair<MyType, IEnumerable<OtherType>>>转换为相同类型的新序列,除了我只想要First()在value(IEnumerable<OtherType>)中.像这样的东西(伪代码):

  var toReturn = from kv in source
                 let k = new KeyValuePair(kv.Key, kv.Value.First())
                 select k;
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 9

我不确定你是否希望新KeyValuePair中的Value是该类型或单个元素的可枚举.这是两个版本

IEnumerable版本

var toReturn = source.Select(x => new KeyValuePair<SomeType,IEnumerable<SomeOtherType>>(x.Key, x.Value.Take(1));
Run Code Online (Sandbox Code Playgroud)

非可枚举版本

var toReturn = source.Select(x => new KeyValuePair<SomeType,SomeOtherType>(x.Key,x.Value.First());
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

您所缺少的只是要使用的KeyValuePair的类型.您可以使用Jared的lambda表达式版本,或者如果您喜欢查询表达式语法:

var toReturn = from kv in source
               select new KeyValuePair<MyType, OtherType>(kv.Key, 
                                                          kv.Value.First());
Run Code Online (Sandbox Code Playgroud)

如果您不想显式指定类型参数,则可以创建自己的帮助器类并使用类型推断:

// Non-generic helper class.
public static class KeyValuePair
{
    public static KeyValuePair<TKey, TValue> Of(TKey key, TValue value)
    {
        return new KeyValuePair<TKey, TValue>(key, value); 
    }
}
Run Code Online (Sandbox Code Playgroud)

您的查询变为:

var toReturn = from kv in source
               select KeyValuePair.Of(kv.Key, kv.Value.First());
Run Code Online (Sandbox Code Playgroud)

要么

var toReturn = source.Select(kv => KeyValuePair.Of(kv.Key, kv.Value.First());
Run Code Online (Sandbox Code Playgroud)

编辑:哎呀 - 我想我也误解了你的问题.如果你想要它的类型完全相同,即值也可以枚举,只需使用Take(1)而不是First():

var toReturn = source.Select(kv => KeyValuePair.Of(kv.Key, kv.Value.Take(1));
Run Code Online (Sandbox Code Playgroud)

(不是类型推断可爱吗?:)