LINQ:IEnumerable<;KeyValuePair<;SomeType,IEnumerable<;其他类型>&燃气轮机&燃气轮机;选择

LINQ:IEnumerable<;KeyValuePair<;SomeType,IEnumerable<;其他类型>&燃气轮机&燃气轮机;选择,linq,Linq,如何将此IEnumerable转换为新的 相同类型的序列,除了我只需要值(IEnumerable)中的First()。类似这样的代码(伪代码): 我不确定您是否希望新KeyValuePair中的值是该类型的可枚举值还是单个元素。这两个版本都有 IEnumerable版本 var toReturn = source.Select(x => new KeyValuePair<SomeType,IEnumerable<SomeOtherType>>(x.Key, x.Va

如何将此
IEnumerable
转换为新的 相同类型的序列,除了我只需要值(
IEnumerable
)中的
First()
。类似这样的代码(伪代码):


我不确定您是否希望新KeyValuePair中的值是该类型的可枚举值还是单个元素。这两个版本都有

IEnumerable版本

var toReturn = source.Select(x => new KeyValuePair<SomeType,IEnumerable<SomeOtherType>>(x.Key, x.Value.Take(1));
var-toReturn=source.Select(x=>newkeyvaluepair(x.Key,x.Value.Take(1));
不可枚举版本

var toReturn = source.Select(x => new KeyValuePair<SomeType,SomeOtherType>(x.Key,x.Value.First());
var-toReturn=source.Select(x=>newkeyvaluepair(x.Key,x.Value.First());

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

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

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


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

为什么要获得相同类型的集合?当您只有第一个元素时,您不需要集合(
IEnumerable
),只需要一个值(
OtherType

这应该是正确的(就像您发布的一样)(您只需要为KeyValuePair添加通用参数)

var toReturn=从源中的kv选择新的KeyValuePair(kv.Key,kv.Value.First());
如果你真的想得到一个相同类型的集合,写

var toReturn = from kv in source select new KeyValuePair<SomeType, IEnumerable<OtherType>>(kv.Key, new [] { kv.Value.First() });
var toReturn=from kv in source选择新的KeyValuePair(kv.Key,new[]{kv.Value.First()});
注意:将KeyValuePair封装到泛型函数中时,不需要为其提供显式类型参数

KeyValuePair<TKey, TValue> Pair<TKey, TValue>(TKey key, TValue value) {
    return new KeyValuePair<TKey, TValue>(key, value);
}
//
var foo = Pair(1, "Hello");
KeyValuePair对(TKey-key,TValue-value){
返回新的KeyValuePair(键,值);
}
//
var foo=配对(1,“你好”);

谢谢bunch,我需要第一个版本。我确实尝试过,但忘记在KeyValuePair中指定类型,因此出现了一个错误。我需要在同一个类型中使用管道将其传输到处理另一个类型的相同方法。这是按日期创建描述排序的,我需要显示所有或仅显示最新的类型。我调用了我的“Of”方法“Create”相反,当我需要手动创建KeyValuePairs时,我非常喜欢这种方法。。。
var toReturn = from kv in source
               select KeyValuePair.Of(kv.Key, kv.Value.First());
var toReturn = source.Select(kv => KeyValuePair.Of(kv.Key, kv.Value.First());
var toReturn = source.Select(kv => KeyValuePair.Of(kv.Key, kv.Value.Take(1));
  var toReturn = from kv in source select new KeyValuePair<SomeType, OtherType>(kv.Key, kv.Value.First());
var toReturn = from kv in source select new KeyValuePair<SomeType, IEnumerable<OtherType>>(kv.Key, new [] { kv.Value.First() });
KeyValuePair<TKey, TValue> Pair<TKey, TValue>(TKey key, TValue value) {
    return new KeyValuePair<TKey, TValue>(key, value);
}
//
var foo = Pair(1, "Hello");
var toReturn = source
.ToDictionary(
  kvp => kvp.Key,
  kvp => kvp.Value.Take(1)
);