我使用带有三元运算符和IEnumerable<string>
语句的Select
有一种奇怪的行为。
我有两个不同对象的列表。一个列表包含Enums
,另一个列表包含对象。这些对象确实具有String
属性
如果一个列表是null
或empty
,我想获取另一个列表的值
这是一些代码:
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);
问题是exportTypes
是null
但是我没有得到它......
当我使用if-else
执行此操作时,一切都按预期工作。如果exportTypes
的类型为List<string>
,我在ToList()
语句后调用Select
,一切正常。
使用var a = MyListOfExportTypes.Select(x => x.ToString());
和var b = MyListOfExportItems.Select(x => x.Type);
可以正常运行
必须是三元运算符和/或IEnumerable
的东西。但是什么?
或者我错过了什么?有什么建议?
修改
我现在有截图...
请注意,foreach
上方的代码仍有效......
答案 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();
}
}