当前位置: 首页 > 编程语言 > C#

过滤模板列表,属性名称为字符串share

时间:2023-04-11 01:50:23 C#

示例类如下publicclassSample{ListsourceList=newList();publicvoidapplyFilter(stringpropertyName,EnumOperatoroperator,objectvalue){}}在这里我想使用linq或动态linq来实现过滤器,但我没有得到任何积极的方向来实现这个功能。请给我一些积极的方向,以便我可以实现此功能。谢谢。我建议返回过滤后的列表而不是修改源,字符串“operator”是C#关键字,因此方法的签名可以是:publicListApplyFilter(stringpropertyName,EnumOperatoroperatorType,objectvalue){...我假设EnumOperator是一个具有如下值的枚举:publicenumEnumOperator{Equal,NotEqual,Bigger,Smaller}并且您可以以某种方式检查运算符是否通过了测试值或者测试是否失败,例如:publicstaticclassOperatorEvaluator{publicstaticboolEvaluate(EnumOperatoroperatorType,objectfirst,objectsecond){...}}鉴于此,您可以执行以下操作:publicListApplyFilter(stringpropertyName,EnumOperatoroperatorType,objectvalue){PropertyInfopi=typeof(T).GetProperty(propertyName);列表结果=sourceList.Where(item=>{varpropValue=pi.GetValue(item,null);returnOperatorEvaluator.Evaluate(operatorType,propValue,value);}).ToList();返回结果;也就是说,您始终可以使用LINQ的方法过滤几乎所有内容,而无需诉诸反射。要使用动态表达式(作为字符串)进行查询,您可以使用Microsoft的ScottGu的DynamicLINQ。Sample支持以下操作1.Select2.Where3.Order4.Skip5.Take6.GroupBy以上操作均以字符串为参数。它还有一种非常易于使用的小型表达式语言(用于构建选择器/谓词/等)。示例:varquery=db.Customers.Where("City=@0andOrders.Count>=@1","London",10).OrderBy("CompanyName").Select("new(CompanyNameasName,Phone)");这里我给你一个例子如何使用LINQonListitems实现过滤。公共类clsCountry{公共字符串_CountryCode;公共字符串_CountryName;//publicclsCountry(stringstrCode,stringstrName){this._CountryCode=strCode;this._CountryName=strName;}//公共字符串CountryCode{get{return_CountryCode;}set{_CountryCode=value;}}//publicstringCountryName{get{return_CountryName;}设置{_CountryName=值;现在,让我们创建一个基于类clsCountry的对象列表,并将它们存储在List对象中。列出lstCountry=newList();lstCountry.Add(newclsCountry("美国","美国"));lstCountry.Add(newclsCountry("英国","英国"));lstCountry.Add(newclsCountry("IND","India"));接下来,我们将List对象lstCountry绑定到名为drpCountry的DropDownList控件,如下所示:drpCountry.DataSource=lstCountry;drpCountry.DataValueField="国家代码";drpCountry.DataTextField="国家名称";drpCountry.DataBind();现在,使用LINQ过滤来自lstCountry对象的数据,并将过滤后的列表绑定到下拉控件drpCountry。varfilteredCountries=fromcinlstCountrywherec.CountryName.StartsWith("U")selectc;drpCountry.DataSource=filteredCountries;drpCountry.DataValueField="国家代码";drpCountry.DataTextField="国家名称";drpCountry.DataBind();现在,下拉控件只有2个项目USUK现在将这些技术应用到您的案例中。您可以使用反射来检索属性值,并且可以在运算符上使用简单的switch语句来执行过滤:publicIEnumerableApplyFilter(stringpropertyName,EnumOperatorop,objectvalue){foreach(TiteminsourceList){objectpropertyValue=GetPropertyValue(item,propertyName);}如果(ApplyOperator(item,propertyValue,op,value){yieldreturnitem;}}}privateobjectGetPropertyValue(objectitem,stringpropertyName){PropertyInfoproperty=item.GetType().GetProperty(propertyName);//TODOhandlenullreturnproperty.GetValue();}privateboolApplyOperator(objectpropertyValue,EnumOperatorop,objectvalue){switch(op){caseEnumOperator.Equals:returnpropertyValue.Equals(value);//TODO其他运算符默认值:抛出新的UnsupportedEnumException(op);(优化是在循环外寻找PropertyInfo)以上是C#学习教程:过滤模板列表,属性名是所有字符串共享的内容,如果对大家有用还需要了解更多C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: