繁体   English   中英

如何检查ReportParameter列表中是否存在字符串值C#

[英]how to check if a string value exists in ReportParameter list c#

我有一个名为lstParam的ReportParameter列表, lstParam包含几个值。

List<ReportParameter> lstParam = new List<ReportParameter>();
ReportParameter rpm = new ReportParameter();    
rpm.Name = "Department";
rpm.Name = "Location";
lstParam.Add(rpm);

注意: ReportParameter is used from reporting services rdlobject model

现在,我需要检查列表是否具有特定的字符串值,并且以下代码不适用于“ ReportParameter”列表。

var matchingvalues = !lstParam.Where(stringToCheck => stringToCheck.Contains(stringValue));

if (!lstParam.Any(str => str.Contains(stringValue)))
  { 

  }

上面的语句都没有帮助,我得到了以下错误。

'ReportParameter' does not contain a definition for 'Contains' and the best extension 
method overload 'Queryable.Contains<string>(IQueryable<string>,string)' 
requires a receiver of type 'IQueryable<string>'

ReportParameter类:

public class ReportParameter : ReportObject, INamedObject
{
    public ReportParameter();

    [DefaultValue(false)]
    public bool AllowBlank { get; set; }
    public DataTypes DataType { get; set; }
    public DefaultValue DefaultValue { get; set; }
    [DefaultValue(false)]
    public bool Hidden { get; set; }
    [DefaultValue(false)]
    public bool MultiValue { get; set; }
    [XmlAttribute(typeof(string))]
    public string Name { get; set; }
    [DefaultValue(false)]
    public bool Nullable { get; set; }
    [ReportExpressionDefaultValueAttribute]
    public ReportExpression Prompt { get; set; }
    [DefaultValue("")]
    [XmlChildAttributeAttribute("Prompt", "LocID", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner")]
    public string PromptLocID { get; set; }
    [DefaultValue(UsedInQueryTypes.Auto)]
    public UsedInQueryTypes UsedInQuery { get; set; }
    public ValidValues ValidValues { get; set; }

    protected override bool RdlSemanticEqualsCore(ReportObject rdlObj, ICollection<ReportObject> visitedList);
}

真的很感谢任何建议。

如果您只想检查是否有任何满足您条件的物品,可以请尝试使用此代码

bool matchingvalues = lstDSParameter.SelectMany(stringToCheck => stringToCheck.Name.Contains(stringValue) || stringToCheck.PromptLocID.Contains(stringValue)).ToList().Count > 0

您描述两个列表: lstParamlstDSParameter 我认为这是一个错字,它们是相同的列表。

lstParam中的每个元素都属于ReportParameter类型。 如果使用Enumerable.Where ,则ReportParameter子句中的每个项目都代表一个ReportParameter ReportParameter不是字符串,因此您得到描述的编译器错误。

您说您需要检查列表是否具有特定的字符串值

显然,因为列表不包含字符串,所以没有任何字符串。 因此,我假设您需要检查序列中元素的某个属性是否包含特定的字符串值。 假设您要检查序列中ReportParameters的任何名称是否包含特定的字符串值。

为此,您必须将序列中的每个元素转换为包含每个元素的Name值的字符串。 在Linq中,每当需要将元素从序列转换为其他东西时,都可以使用Enumerable.Select:

List<ReportParameter> lstParam = ...;
var reportParameterNames = lstParam.Select(reportParameter => reportParameter.Name);

“从lstParam中的每个reportParameter中,获取reportParameter.Name,并将这些名称放入名为reportParameterNames的新序列中”

现在检查是否有任何reportParameterNames等于SpecificStringValue ,可以使用Enumerable.Any:

bool lstParamContainSpecificStringValue = reportParameterNames
    .Any(name => name == SpecificStringValue);

“检查reportParameterNames序列中的任何元素是否等于SpecificStringValue”

本文帮助我了解了LINQ,并学习了如何使用它。

看来您使用的是错误名称空间中的ReportParameter 尝试在Microsoft.ReportingServices.ReportRendering命名空间中使用一个。 这包含一个Value属性。

MSDN ReportParameter类

因此,您可以像这样使用它:

if (!lstParam.Any(p => p.Value?.ToString().Contains(stringValue)))
{ 

}

已经看问题这个

也许反思可以在这里为您提供帮助。 我建议您第一遍

    List<ReportParameter> lstParam = new List<ReportParameter>();
foreach(var item in lstParam )
{
//and then loop through class properties 
Type type = item.GetType();
PropertyInfo[] properties = type.GetProperties();

foreach (PropertyInfo property in properties )
{
    //now here you can play with class properties 
//like property.Name or property.Value
//place your check here
}
}

我没有测试此代码,只是建议您使用。 我希望这会有所帮助,尝试找到其他有效的方法来摆脱循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM