C# Linq if else条件
如何将下面的查询合并到单个查询中?我认为多个if将不必要地增加代码的复杂性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
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很高兴我能帮忙。实际上,您甚至可以为比较变量的类型引入第二个泛型参数,从而使其更通用。这里的这个版本只能比较字符串。