我如何将其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)
我不确定你是否希望新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)
您所缺少的只是要使用的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)
(不是类型推断可爱吗?:)
| 归档时间: |
|
| 查看次数: |
11280 次 |
| 最近记录: |