在 LINQ 中解构包含 ValueTuple 的容器
Deconstruct Container containing ValueTuple in LINQ
我可以通过扩展方法解构容器:
var limits = new[] { MyEnum.A , MyEnum.B , MyEnum.C }
.ToDictionary( x => x ,
x => ( SupportedLimit: GetLimit( x ) , RequiredLimit: 0 ) );
public static class Extensions
{
public static void Deconstruct<TKey, TVal>(
this KeyValuePair<TKey , TVal> tuple ,
out TKey key , out TVal value )
{
key = tuple.Key;
value = tuple.Value;
}
public static void Deconstruct<TKey, TVal1, TVal2>(
this KeyValuePair<TKey , (TVal1,TVal2)> tuple ,
out TKey key , out TVal1 v1 , out TVal2 v2 )
{
key = tuple.Key;
(v1 , v2) = tuple.Value;
}
}
// works
foreach( var ( enumVal , supportedLimit , requiredLimit ) in limits )
Debugger.Break();
如何在 LINQ 中解构包含 System.ValueTuple
的 container/dictionary?
// won't work, .Where() expects Func<T,bool> not Func<T1,T2,T3,bool>
var failedLimits = limits.Where( ( _ , sup , req ) => sup < req );
我只是想知道如何(以及是否)可以在(任何)LINQ 方法中解构 ValueTuple。我想我必须为每个 Linq 方法(类似列表)添加一个扩展方法 + 字典的重载 + ValueTuple 中的每个值。
示例中的 Where() 会是什么样子?
由于您处理的是 Dictionary
,因此您迭代的值是 KeyValuePair
。您需要处理 KeyValuePair
的 Value
部分,然后只使用值元组的命名 属性。
var failedLimits = limits.Where(kvp => kvp.Value.SupportedLimit < req);
public static class LinqExtensions
{
public static IEnumerable<KeyValuePair<TKey,(T1,T2)>> Where<TKey,T1,T2>(
this IEnumerable<KeyValuePair<TKey,(T1,T2)>> source ,
Func<TKey,T1,T2, Boolean> predicate )
=> source.Where( predicate );
}
- 类列表类型的重载 + 每个 ValueTuple 参数的数量
我可以通过扩展方法解构容器:
var limits = new[] { MyEnum.A , MyEnum.B , MyEnum.C }
.ToDictionary( x => x ,
x => ( SupportedLimit: GetLimit( x ) , RequiredLimit: 0 ) );
public static class Extensions
{
public static void Deconstruct<TKey, TVal>(
this KeyValuePair<TKey , TVal> tuple ,
out TKey key , out TVal value )
{
key = tuple.Key;
value = tuple.Value;
}
public static void Deconstruct<TKey, TVal1, TVal2>(
this KeyValuePair<TKey , (TVal1,TVal2)> tuple ,
out TKey key , out TVal1 v1 , out TVal2 v2 )
{
key = tuple.Key;
(v1 , v2) = tuple.Value;
}
}
// works
foreach( var ( enumVal , supportedLimit , requiredLimit ) in limits )
Debugger.Break();
如何在 LINQ 中解构包含 System.ValueTuple
的 container/dictionary?
// won't work, .Where() expects Func<T,bool> not Func<T1,T2,T3,bool>
var failedLimits = limits.Where( ( _ , sup , req ) => sup < req );
我只是想知道如何(以及是否)可以在(任何)LINQ 方法中解构 ValueTuple。我想我必须为每个 Linq 方法(类似列表)添加一个扩展方法 + 字典的重载 + ValueTuple 中的每个值。 示例中的 Where() 会是什么样子?
由于您处理的是 Dictionary
,因此您迭代的值是 KeyValuePair
。您需要处理 KeyValuePair
的 Value
部分,然后只使用值元组的命名 属性。
var failedLimits = limits.Where(kvp => kvp.Value.SupportedLimit < req);
public static class LinqExtensions
{
public static IEnumerable<KeyValuePair<TKey,(T1,T2)>> Where<TKey,T1,T2>(
this IEnumerable<KeyValuePair<TKey,(T1,T2)>> source ,
Func<TKey,T1,T2, Boolean> predicate )
=> source.Where( predicate );
}
- 类列表类型的重载 + 每个 ValueTuple 参数的数量