2017-07-23 24 views
0

我有一个对象列表,可以说DataTables。有没有办法从列表中使用一个对象,只要它存在?

是否有可能使用对象仅如果它存在的名单?

例如,如果TableList含有5个数据表命名为A,B,C,d,E。

if (TableList.Any(t => t.TableName == "a")) 
{ 
    TableList.First(t => t.TableName == "a").DoStuff(); 

    //OR 

    DataTable TheReturnOf_a = TableList.First(t => t.TableName == "a"); 
} 
else if (TableList.Any(t => t.TableName == "f")) 
{ 
    TableList.First(t => t.TableName == "f")).DoMoreStuff(); 
} 
+0

您可以用'FirstOrDefault'并检查返回如果你的对象引用类型值不为空。 –

+0

你也可以考虑使用一个'Dictionary',其中键是'TableName'。这可能会有所帮助,如果'TableList'具有大量的条目,并且您正在进行大量查找。 – mjwills

回答

3

假设TableList具有被引用类型的单元类型,则可以使用FirstOrDefault()返回第一匹配或空,则零条件操作符来仅仅调用该方法,如果目标是非空:

TableList.FirstOrDefault(t => t.TableName == "a")?.DoStuff(); 

所以你的原代码等同于:

var tableA = TableList.FirstOrDefault(t => t.TableName == "a"); 
if (tableA != null) 
{ 
    tableA.DoStuff(); 
} 
else 
{ 
    TableList.FirstOrDefault(t => t.TableName == "f").DoStuff(); 
} 

或者,如果你打算做同样的事情到表你最终使用,而你只是想获得正确的表格,你可以使用或空合并运算符:

// Find an "a" table if possible, but revert to an "f" table otherwise. 
var table = TableList.FirstOrDefault(t => t.TableName == "a") ?? 
      TableList.FirstOrDefault(t => t.TableName == "f"); 
// Call DoStuff() on the table - handling the case where there isn't an 
// "a" or an "f" table. 
table?.DoStuff(); 
+0

谢谢你的回复。我非常感激。如果我确实需要根据哪张表运行不同的功能呢? –

+0

@TheNextFreud:然后你会根据我的答案的中间部分使用if/else。如果你可能要做好三个不同的表的东西,这将取决于你是否是从'if'块还是不回来,但你可能会使用多个嵌套的if/else。 –

+0

如果我使用out参数创建布尔函数,该怎么办?这样,我的if语句将已经设置表使用,否则移动到下一个块..? –

相关问题