Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq if else条件_C#_.net_Linq_Lambda - Fatal编程技术网

C# Linq if else条件

C# Linq if else条件,c#,.net,linq,lambda,C#,.net,Linq,Lambda,如何将下面的查询合并到单个查询中?我认为多个if将不必要地增加代码的复杂性 var query = scenario.Where(x => x.ScenarioNumber == ScenarioNumber).Select(x => x).Distinct().ToList(); // Match exception number else return wild card entries. if(query.Any(x=>x.ExcepNumber == ExcepNum

如何将下面的查询合并到单个查询中?我认为多个if将不必要地增加代码的复杂性

var query = scenario.Where(x => x.ScenarioNumber == ScenarioNumber).Select(x => x).Distinct().ToList();

// Match exception number else return wild card entries.
if(query.Any(x=>x.ExcepNumber == ExcepNumber))
{
    query = query.Where(x => x.ExcepNumber == ExcepNumber).ToList();
}
else
{
   query = query.Where(x => x.ExcepNumber == "**").ToList();
}

// Match regime else return wild card entries.
if (query.Any(x => x.Regime == Regime))
{
     query = query.Where(x => x.Regime == Regime).ToList();
}
else
{
     query = query.Where(x => x.Regime == "**").ToList();
}
finalResponse = query.Select(x => x.TestColumn).Distinct().ToList();

我有一个建议。您可以将其提取到一个通用方法中,在该方法中,您将传递一个选择器函数,该函数指定要用于筛选的属性以及要比较的两个选项(当然还有集合)

private List EitherFilterOrWildCard(函数选择器、字符串比较、字符串其他比较、列表查询)
{
var temp=query.Where(x=>selector(x)==compare);
return temp.Any()?temp.ToList():query.Where(x=>selector(x)==elseCompare.ToList();
}
您的if语句将收缩到以下两行:

query = EitherFilterOrWildCard<MyClass>(x => x.ExcepNumber, ExcepNumber, "**", query);
query = EitherFilterOrWildCard<MyClass>(x => x.Regime, Regime, "**", query);
query=EitherFilterOrWildCard(x=>x.ExcepNumber,ExcepNumber,**,query);
query=EitherFilterOrWildCard(x=>x.Regime,Regime,“**”,query);

我有一个建议。您可以将其提取到一个通用方法中,在该方法中,您将传递一个选择器函数,该函数指定要用于筛选的属性以及要比较的两个选项(当然还有集合)

private List EitherFilterOrWildCard(函数选择器、字符串比较、字符串其他比较、列表查询)
{
var temp=query.Where(x=>selector(x)==compare);
return temp.Any()?temp.ToList():query.Where(x=>selector(x)==elseCompare.ToList();
}
您的if语句将收缩到以下两行:

query = EitherFilterOrWildCard<MyClass>(x => x.ExcepNumber, ExcepNumber, "**", query);
query = EitherFilterOrWildCard<MyClass>(x => x.Regime, Regime, "**", query);
query=EitherFilterOrWildCard(x=>x.ExcepNumber,ExcepNumber,**,query);
query=EitherFilterOrWildCard(x=>x.Regime,Regime,“**”,query);

对于linq,您必须使用(条件)?true:falseoff主题,但1)第一个查询中的select是多余的。2) 在第一次
ToList
调用后,实际上内存中有一个真实的列表,因此您需要在最后一行再次调用
ToList
谢谢@jdweng您能详细说明一下吗?至于我如何将它用于上面的e.gjdwebg建议使用@jdweng,这并不是做同样的事情,因为它将返回通配符和您必须使用的linq的搜索属性(条件)?true:falseoff主题,但1)第一个查询中的select是多余的。2) 在第一次
ToList
调用后,实际上内存中有一个真实的列表,因此您需要在最后一行再次调用
ToList
谢谢@jdweng您能详细说明一下吗?至于我如何将它用于上面的e.gjdwebg建议使用@jdweng,这并不是做同样的事情,因为它将返回通配符和搜索的属性,这正是我想要的。谢谢@mongzhu@SushmaChaudhary很高兴我能帮忙。实际上,您甚至可以为比较变量的类型引入第二个泛型参数,从而使其更通用。这个版本只能比较字符串。这正是我想要的。谢谢@mongzhu@SushmaChaudhary很高兴我能帮忙。实际上,您甚至可以为比较变量的类型引入第二个泛型参数,从而使其更通用。这里的这个版本只能比较字符串。