【问题标题】:how to check if a string value exists in ReportParameter list c#如何检查ReportParameter列表中是否存在字符串值c#
【发布时间】:2016-11-29 12:15:46
【问题描述】:

我有一个名为 lstParam 的 ReportParameter 列表,其中的值很少。

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);
}

非常感谢任何建议。

【问题讨论】:

  • ReportParameter 显然不是字符串。你真的想检查这个对象的特定字符串属性吗?
  • 你能告诉 ReportParameter 类它包含什么吗?基于此,我们必须决定实施。
  • @Andrei - 是的,我想用 lstParam 列表检查字符串值。
  • @SouvikGhosh - 更新了我的帖子。
  • 我认为您希望检查列表中任何项目的属性名称或 PromptLocID 是否包含字符串值。我对吗?如果我错了,请纠正我。

标签: c# asp.net .net reporting-services ssrs-2012


【解决方案1】:

如果您只想检查是否有任何项目满足您的条件,您可以试试这个代码

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

【讨论】:

  • SelectMany 处抛出错误消息。 Try specifying the type arguments explicitly
  • 布尔匹配值 = lstDSParameter.Any(stringToCheck => stringToCheck.Name.Contains(stringValue) || stringToCheck.P​​romptLocID.Contains(stringValue));你能试试这个吗?如果列表中的任何项目满足两个条件中的任何一个,这将返回 true。
【解决方案2】:

您描述了两个列表:lstParam 和 lstDSParameter。我认为这是一个错字,它们是同一个列表。

lstParam 中的每个元素都是 ReportParameter 类型。如果使用Enumerable.Where,那么were 子句中的每一项都代表一个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"

This article 帮助我了解了 LINQ,并学会了如何使用它

【讨论】:

  • 只有一个列表,需要明确的是,这实际上是我想要的 bool lstParamContainSpecificStringValue = lstDSParameter.Any(name =&gt; name == rpmObj.Name); rpmObj 是另一个列表中的报告参数值之一。
【解决方案3】:

您似乎使用了来自错误命名空间的ReportParameter。尝试使用Microsoft.ReportingServices.ReportRendering Namespace 中的那个。这个包含一个Value 属性。

MSDN ReportParameter Class

所以你可以这样使用它:

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

}

【讨论】:

  • 使用现有类中的Name 属性怎么样?
  • @vicky Name 是报告参数的名称而不是其值。该问题涉及检查特定的字符串值,这是否意味着参数名称或其值?你已经知道名字了,对吧?部门和地点。
【解决方案4】:

看问题this。

可能是反射可以帮助你在这里。 我建议您通过

进行第一次循环
    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
}
}

我没有测试过这段代码,只是建议你走的路。我希望这会有所帮助,试图找到一些其他有效的方法来摆脱循环。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2012-06-03
    相关资源
    最近更新 更多