IEnumerable使用三元运算符的Select语句

时间:2014-12-03 15:09:11

标签: c# linq ienumerable ternary-operator

我使用带有三元运算符和IEnumerable<string>语句的Select有一种奇怪的行为。
我有两个不同对象的列表。一个列表包含Enums,另一个列表包含对象。这些对象确实具有String属性 如果一个列表是nullempty,我想获取另一个列表的值 这是一些代码:

public class ExportItem
{
    public string Type;
    ...
}

public enum ExportType
{
    ExportType1,
    ExportType2,
    ...
}

List<ExportItem>始终由配置文件填充。如果提供了命令行参数,则填充List<ExportType>。因此,如果List<ExportType>已填充,我想使用它们,否则我想使用配置文件中的那些 所以我的代码是这样的:

IEnumerable<string> exportTypes = MyListOfExportTypes != null &&
    MyListOfExportTypes.Any() ? MyListOfExportTypes.Select(x => x.ToString()) :
    MyListOfExportItems.Select(x => x.Type);

问题是exportTypesnull但是我没有得到它...... 当我使用if-else执行此操作时,一切都按预期工作。如果exportTypes的类型为List<string>,我在ToList()语句后调用Select,一切正常。
使用var a = MyListOfExportTypes.Select(x => x.ToString());var b = MyListOfExportItems.Select(x => x.Type);可以正常运行 必须是三元运算符和/或IEnumerable的东西。但是什么?

或者我错过了什么?有什么建议?

修改
我现在有截图... enter image description here

请注意,foreach上方的代码仍有效......

1 个答案:

答案 0 :(得分:3)

不确定这是否已得到解答, 但我认为这与您使用LINQ延迟执行的事实有关。

编写LINQ查询时, 创建查询和执行查询之间存在差异。

编写select语句,正在创建查询,添加ToList()会执行它。 可以把它想象成在SQL服务器控制台中编写SQL查询(这是编写阶段), 一旦你点击F5(或播放按钮),你就执行它。

我希望这个小代码示例有助于澄清它。

    public class SomeClass
    {
        public int X { get; set; }
        public int Y { get; set; }

        public void Test()
        {
            //Here I'm creating a List of Some class
            var someClassItems = new List<SomeClass> { 
                new SomeClass { X = 1, Y = 1 }, 
                new SomeClass { X = 2, Y = 2 } 
            };

            //Here I'm creating a Query
            //BUT, I'm not executing it, so the query variable, is represented by the IEnumerable object
            //and refers to an in memory query
            var query = someClassItems.
                Select(o => o.X);

            //Only once the below code is reached, the query is executed.
            //Put a breakpoint in the query, click the mouse cursor inside the select parenthesis and hit F9
            //You'll see the breakpoint is hit after this line.
            var result = query.
                ToList();

        }
    }