将对象转换为另一种LINQ风格的对象

时间:2017-08-03 14:20:25

标签: c# linq lambda

LINQ允许优雅地将方法返回的集合转换为不同的集合,即

var x = SomeMethod().Select(t => new { ... });

现在,C#中是否有一种简洁的方法来转换方法的返回值而不引入中间变量?声明和调用lambda似乎有效,但非常难看:

var x = new Func<T, object>(t => { return new { ... }; })(SomeMethod());

我是否遗漏了一些显而易见的事情,或者这是今天用C#做的最好的事情?

2 个答案:

答案 0 :(得分:1)

您可以将Select后跟Single应用于根据调用SomeMethod的结果创建的一个项目的序列,如下所示:

var x = Enumerable.Repeat(SomeMethod(), 1).Select(r => new {...}).Single();

如果你做了很多,你可以为此做一个通用的扩展方法:

static class MyExtensions {
    public static TRes Transform<TSrc,TRes>(this TSrc src, Func<TSrc,TRes> selector) {
        return selector(src);
    }
}

现在语法变得非常简单:

var res = SomeMethod().Transform(x => new { ... });

答案 1 :(得分:0)

我只是想通用的扩展方法可以填补空白:

public static class TransformExtension
{
    public static T2 Transform<T1, T2>(this T1 t1, Func<T1, T2> transform)
    {
        return transform(t1);
    }
}

样本用法:

public class A { };
public class B { };

void Foo()
{
    var a = new A();
    var b = a.Transform(x => new B());
}

很高兴听到为什么这可能是一个糟糕的主意。