首页 > 解决方案 > 循环遍历 IEnumerable 并将它们传递给具有多个 if/else 条件的模型

问题描述

我有一个IEnumerable这样的实体列表

return entities.Select(g => new Model(
                g.Field1,
                g.Field2,
                g.Field3
));

但是,需求发生了变化,我需要遍历列表并检查每个实体中的某个字符串字段,然后将其传递给模型。如果字符串字段等于某个字符串,比如“a”,那么它将以一种方式传入模型,但是当字符串字段等于“b”或“c”甚至“d”时,它将以 a 的形式传入模型根据字段的字符串类型相应地采用不同的方式。

return entities.
.GroupBy(x=> x.field =="a")
.Select(g => new Model(
                g.Field1,
                g.Field2,
                g.Field3,

else
.GroupBy(x=> x.field =="b")
.Select(g => new Model(
                g.Field4,
                g.Field5,
                g.Field6,

else
.GroupBy(x=> x.field =="c")
.Select(g => new Model(
                g.Field7,
                g.Field8,
                g.Field9,
);

我正在考虑先做一个 foreach 然后再做一个 groupBy then if 语句。但不确定如何为该 linq 语句构造适当的语法。如果实体的数量可以达到数百个,那么在这种情况下是否建议使用 foreach 循环?

标签: c#linqconditional-statements

解决方案


您可以使用 switch 表达式(自 C# 8 起新增)。为了将它与 EF 一起使用,您首先必须选择一个包含所有需要属性的匿名类型,然后将其加载到内存中(使用 eg ToList()):

return entities.Select(g => new
{
    g.field, g.Field1, g.Field2, g.Field3,
    g.Field4, g.Field5, g.Field6, G.Field7,
    g.Field8, g.Field9
}).ToList().Select(g => g.field switch
{
   "a" => new Model(g.Field1, g.Field2, g.Field3),
   "b" => new Model(g.Field4, g.Field5, g.Field6),
   "c" => new Model(g.Field7, g.Field8, g.Field9)
});

推荐阅读