Linq选择返回字符串而不是对象

时间:2016-01-07 15:36:32

标签: c# linq lambda

我有以下代码:

var languages = _languageService
            .GetAll()
            .Select(x => (((LanguageViewModel) new LanguageViewModel().InjectFrom(x))))
            .ToList();

执行此操作时,languages会按预期变为LanguageViewModel个对象的集合:

Working

我要做的是,在选择时,还将对象的Code属性转换为大写,如下所示:

var languages = _languageService
            .GetAll()
            .Select(x => (((LanguageViewModel) new LanguageViewModel().InjectFrom(x)).Code = x.Code.ToUpper()))
            .ToList();

我希望languages对象中包含多个LanguageViewModel,但它看起来像这样:

enter image description here

我的猜测是,我使用Select(x => (new Object().Property = Value))这样的语句来选择Property。但是,如何返回一个更改了其属性的对象?在注入之前使用对象初始化器不是一个选项,因为它被覆盖,在Inject之后使用它是不可能的,因为它还没有被转换,所以我在这里找到了似乎不起作用的解决方案。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:10)

你正确地猜到了什么是错的:你将lambda体改成了一个返回字符串的表达式。

您不能将lambda主体编写为执行所需操作的单个表达式,但您不需要这样做。您可以在lambda中放置多个语句:

var languages = _languageService
    .GetAll()
    .Select(x => {
        var lvm = (LanguageViewModel)new LanguageViewModel().InjectFrom(x);
        lvm.Code = x.Code.ToUpper();
        return lvm;
    })
    .ToList();

我喜欢用较少的打字方式来做到这一点。如果构造函数的属性设置符号被推广为“在返回值上设置属性”,那就太酷了:

var foo = new Bar() { Armpit = new Flapdoodle() { Limpet = 2 } };
var baz = foo.Armpit { Limpet = 4 };

是的,我敢打赌,C#团队会放弃所有内容并立即行动......

我不知道明确的LanguageViewModel演员是否真的有必要,但你已经把它放进去了。

答案 1 :(得分:2)

您的Select行可以重写为

.Select(x =>
 {
  var vm = new LanguageViewModel().InjectFrom(x);
  vm.Code = vm.Code.ToUpper();
  return vm;
 })