如何检查 ReportParameter 列表中是否存在字符串值 c#
how to check if a string value exists in ReportParameter list c#
我有一个名为 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>'
报表参数class:
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
您描述了两个列表:lstParam
和 lstDSParameter
。我认为这是一个错字,它们是同一个列表。
lstParam
中的每个元素都是 ReportParameter
类型。如果使用 Enumerable.Where
,则 were 子句中的每一项都代表一个 ReportParameter
。 ReportParameter 不是字符串,因此会出现您描述的编译器错误。
你说你需要检查列表是否有特定的字符串值。
很明显,因为列表不包含字符串,所以没有任何字符串。因此我假设您需要检查序列中的某个 属性 元素是否包含特定的字符串值。假设您要检查序列中 ReportParameters 的任何名称是否包含特定字符串值。
为此,您必须将序列中的每个元素转换为包含每个元素的名称值的字符串。在 Linq 中,每当您需要将序列中的元素转换为其他内容时,您可以使用 Enumerable.Select:
List<ReportParameter> lstParam = ...;
var reportParameterNames = lstParam.Select(reportParameter => reportParameter.Name);
"From every reportParameter in lstParam, take reportParameter.Name, and put these names in a new sequence called reportParameterNames"
现在检查是否有任何 reportParameterNames 等于 SpecificStringValue
您可以使用 Enumerable.Any:
bool lstParamContainSpecificStringValue = reportParameterNames
.Any(name => name == SpecificStringValue);
"Check if any element in the reportParameterNames sequence equals SpecificStringValue"
This article 帮助我理解了 LINQ,并学会了如何使用它
您似乎使用了来自错误命名空间的 ReportParameter
。尝试使用 Microsoft.ReportingServices.ReportRendering Namespace 中的那个。这个包含一个 Value
属性.
所以你可以这样使用它:
if (!lstParam.Any(p => p.Value?.ToString().Contains(stringValue)))
{
}
看过问题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
}
}
我没有测试过这段代码,只是向您建议要走的路。我希望这会有所帮助,试图找到其他一些有效的方法来摆脱循环。
我有一个名为 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>'
报表参数class:
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
您描述了两个列表:lstParam
和 lstDSParameter
。我认为这是一个错字,它们是同一个列表。
lstParam
中的每个元素都是 ReportParameter
类型。如果使用 Enumerable.Where
,则 were 子句中的每一项都代表一个 ReportParameter
。 ReportParameter 不是字符串,因此会出现您描述的编译器错误。
你说你需要检查列表是否有特定的字符串值。
很明显,因为列表不包含字符串,所以没有任何字符串。因此我假设您需要检查序列中的某个 属性 元素是否包含特定的字符串值。假设您要检查序列中 ReportParameters 的任何名称是否包含特定字符串值。
为此,您必须将序列中的每个元素转换为包含每个元素的名称值的字符串。在 Linq 中,每当您需要将序列中的元素转换为其他内容时,您可以使用 Enumerable.Select:
List<ReportParameter> lstParam = ...;
var reportParameterNames = lstParam.Select(reportParameter => reportParameter.Name);
"From every reportParameter in lstParam, take reportParameter.Name, and put these names in a new sequence called reportParameterNames"
现在检查是否有任何 reportParameterNames 等于 SpecificStringValue
您可以使用 Enumerable.Any:
bool lstParamContainSpecificStringValue = reportParameterNames
.Any(name => name == SpecificStringValue);
"Check if any element in the reportParameterNames sequence equals SpecificStringValue"
This article 帮助我理解了 LINQ,并学会了如何使用它
您似乎使用了来自错误命名空间的 ReportParameter
。尝试使用 Microsoft.ReportingServices.ReportRendering Namespace 中的那个。这个包含一个 Value
属性.
所以你可以这样使用它:
if (!lstParam.Any(p => p.Value?.ToString().Contains(stringValue)))
{
}
看过问题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
}
}
我没有测试过这段代码,只是向您建议要走的路。我希望这会有所帮助,试图找到其他一些有效的方法来摆脱循环。