2

我可以通过扩展方法解构容器:

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();

如何System.ValueTuple在 LINQ 中解构包含 a 的容器/字典?

// 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() 会是什么样子?

4

2 回答 2

1
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 参数
于 2018-09-07T13:49:09.107 回答
0

由于您正在处理 aDictionary您迭代的值是KeyValuePairs。您需要处理的Value部分,KeyValuePair然后只使用值元组的命名属性。

var failedLimits = limits.Where(kvp => kvp.Value.SupportedLimit < req);
于 2018-09-07T13:35:25.710 回答