我可以用IEnumerable <t>而不是IEnumerable <string>编写这个lambda吗?

时间:2018-05-31 23:35:40

标签: c#

是否可以以更通用的方式编写此lambda?它工作正常,但看起来太具体了;不会触及IEnumerable的内容,但应在返回类型中保留。

static readonly Func<
    (IEnumerable<string>, IEnumerable<string>),
    (IEnumerable<string>, IEnumerable<string>),
    (IEnumerable<string>, IEnumerable<string>)
> JoinListTuples = (a, b) =>
    (a.Item1.Concat(b.Item1),
        b.Item2.Concat(b.Item2));

我在考虑这样的事情,但它没有编译:

static readonly Func<
    (IEnumerable<T>, IEnumerable<U>),
    (IEnumerable<T>, IEnumerable<U>),
    (IEnumerable<T>, IEnumerable<U>)
> JoinListTuples = (a, b) =>
    (a.Item1.Concat(b.Item1),
        b.Item2.Concat(b.Item2));

2 个答案:

答案 0 :(得分:4)

类型可以是通用的,方法可以是通用的,但字段不能是通用的。

当您确实需要将此通常作为委托类型时,解决方法是使其成为泛型类的字段:

public static class HelperClass<T, U> {
    public static readonly Func<
        (IEnumerable<T>, IEnumerable<U>),
        (IEnumerable<T>, IEnumerable<U>),
        (IEnumerable<T>, IEnumerable<U>)
    > JoinListTuples = (a, b) =>
        (a.Item1.Concat(b.Item1),
            b.Item2.Concat(b.Item2));
}

但是对于大多数用途来说,将其转换为方法就足够了。 也许是这样的:

static (IEnumerable<T>, IEnumerable<U>) JoinListTuples<T, U>(
    (IEnumerable<T>, IEnumerable<U>) a,
    (IEnumerable<T>, IEnumerable<U>) b)
{
    return (a.Item1.Concat(b.Item1),
        b.Item2.Concat(b.Item2));
}

答案 1 :(得分:2)

我不确定这是否会对你有所帮助

然而,这样的事情可能

public class SomeHelper<T,U>
{

    public static readonly Func<
        (IEnumerable<T>, IEnumerable<U>),
        (IEnumerable<T>, IEnumerable<U>),
        (IEnumerable<T>, IEnumerable<U>)> 
            JoinListTuples = (a, b) => 
               (a.Item1.Concat(b.Item1),b.Item2.Concat(b.Item2));

}

注意,未经测试且不在VS前面