4

これはおそらく初心者の質問になると思います。ブール値に応じて異なる検索条件を選択する方法はありますか? コードの後半で、オブジェクト (alDisabledPrograms) をループ処理します。if/else が正しくないことはわかっています。それをどのように処理したいかを示すためにそこに入れました。これをより大きな if/else 条件内に配置しようとしましたが、後で alDisabledPrograms をループできませんでした。考え?

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
    if(isDup)
    {
        .Where(dp => dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1))
    }
    else
    {
        .Where(dp => dp.Element("ServerType").Value == currentColumn)
    }
    .Descendants("ProgramName")
    .Select(p => p.Value)
    .ToList();
4

6 に答える 6

15

あなたの特定のコードでは、答えは本当に簡単です:

string targetColumn = isDup ? currentColumn.Substring(0, currentColumn.Length - 1)
                            : currentColumn;
var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
           .Where(dp => dp.Element("ServerType").Value == targetColumn)
           .Descendants("ProgramName")
           .Select(p => p.Value)
           .ToList();

ただし、一般に、非常に異なるクエリを適用するには、次のいずれかを使用できます。

IEnumerable<XElement> roles = xlServerRoles.Descendants("ServerRole");
if (isDup)
{
    roles = roles.Where(dp => ...);
}
else
{
    roles = roles.Where(dp => ...);
}
var alDisabledPrograms = roles.Descendants(...)
                               ...

または、条件演算子を使用して正しい述語を作成することもできます。

var filter = isDup ? (Func<XElement, bool>)(dp => ...)
                   : (Func<XElement, bool>)(dp => ...);
var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
       .Where(filter)
       .Descendants("ProgramName")
       .Select(p => p.Value)
       .ToList();
于 2013-04-09T18:41:35.560 に答える
3

where 句に isDup を挿入します。

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
     .Where(dp => isDup ? 
       (dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1)) : 
       (dp.Element("ServerType").Value == currentColumn))
    .Descendants("ProgramName")
    .Select(p => p.Value)
    .ToList();

これでいいと思います。

于 2013-04-09T18:42:12.080 に答える
0

isDup テストを Where 式自体に移動します。通常の if/else ステートメントを使用できるように、単一行式の代わりにインライン匿名関数を使用します。

このような:

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
        .Where(dp => { 
           if (isDup)
           {
             return dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1))
           }
           else
           {
              return dp.Element("ServerType").Value == currentColumn)
           })
    .Descendants("ProgramName")
    .Select(p => p.Value)
    .ToList();
于 2013-04-09T18:40:48.817 に答える
0

ループの開始前に 1 回だけ実行します。

string serverType = currentColumn;
if(isDup)
    serverType = currentColumn.Substring(0, currentColumn.Length - 1);

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole")
    .Where(dp => dp.Element("ServerType").Value == serverType )
    .Descendants("ProgramName")
    .Select(p => p.Value)
    .ToList();
于 2013-04-09T18:42:14.660 に答える
0

次のようにクエリを作成できます。

var query = xlServerRoles.Descendants("ServerRole");

if(isDup)
{
    query = query.Where(dp => dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1))
}
else
{
    query = query.Where(dp => dp.Element("ServerType").Value == currentColumn)
}

var alDisabledPrograms = query.Descendants("ProgramName").Select(p => p.Value).ToList();
于 2013-04-09T18:42:23.877 に答える
0

あなたがいる場所Dup inside Where

.Where(dp => dp.Element("ServerType").Value == (isDup ? currentColumn.Substring(0, currentColumn.Length - 1) 
                                                  : currentColumn))
于 2013-04-09T18:43:31.777 に答える