我有以下课程。我的目标是根据productTypeField和downloadSpeedField筛选组件。我有一个列表lstFilteredComps
,仅当存在大于5的组件时,才要添加具有downloadSpeed小于或等于5的INTERNET productType组件。如果所有组件均小于或等于downloadSpeed 5,则应添加downloadSpeed小于5的INTERNET组件。
课程:
public ct_Component[] Components {
get {
return this.componentsField;
}
set {
this.componentsField = value;
}
}
public partial class ct_Component
{
private string descriptionField;
private string downloadSpeedField;
private string productTypeField;
}
我尝试以下代码,但它具有5 downloadSpeed在所有情况下删除组件,我将如何放置一个条件,以检查是否downlaodSpeed超过5存在与否。也就是说,我的代码仅在有更高可用组件时才删除组件,或者换句话说,只有在存在5MB以上的downloadSpeed组件时才调用FilterInternetComponentLessThan5MB
。
ct_Component[] Components = response;
foreach (ct_Component comp in Components.Where(c => FilterInternetComponentLessThan5MB(c)))
{
list<ct_Component> lstFilteredComps= //add filtered components;
}
FilterComponentLessThan5MB方式
private bool FilterComponentLessThan5MB(ct_Component component)
{
if (component.productType != "INTERNET" || (component.productType == "INTERNET"
&& int.Parse(Regex.Replace(component.downloadSpeed, @"[^\d]", "")) > 5))
{
return true;
}
else
return false;
}
我需要检查类似的东西
foreach (ct_Component comp in Components.Where(Components.any(x=>x.productType == "INTERNET" && int.Parse(Regex.Replace(x.downloadSpeed, @"[^\d]", "")) > 5) ? true : FilterInternetComponentLessThan5MB(c)))
答案 0 :(得分:1)
您可能正在寻找Any
方法,它接收一个秘密参数,类似Where
,但它返回一个布尔值,当集合中的项目之一为您的谓词计算真正为
您最终会得到这样的东西:
ct_Component[] components = response;
if (components.Any(c => c.DownloadSpeedNumber > 5))
{
var newList = new List<ct_Component>();
foreach (ct_Component comp in components.Where(FilterInternetComponentLessThan5MB))
{
//add filtered components to newList.
}
DownloadSpeedNumber
可以是安全地解析现有downloadSpeed
字段的获取器或扩展方法。
请,虽然你会迭代通过在Any
法阵,所以如果你有一个非常大的数组,你可能会重新考虑使用LINQ,只是一个普通去和迭代它只有一次。
答案 1 :(得分:0)
给出了两个谓词函数:
bool FilterNotInternetComponentOrOver5Mb(ct_Component component) =>
(component.productTypeField != "INTERNET") ||
(int.Parse(Regex.Replace(component.downloadSpeedField, @"[^\d]", "")) > 5);
bool FilterInternetComponentOver5Mb(ct_Component component) =>
component.productTypeField == "INTERNET" &&
int.Parse(Regex.Replace(component.downloadSpeedField, @"[^\d]", "")) > 5;
您可以使用以下内容基于5种以上的内容进行过滤:
var hasOver5 = Components.Any(c => FilterInternetComponentOver5Mb(c));
var lstFilteredComps = Components.Where(c => !hasOver5 || FilterNotInternetComponentOrOver5Mb(c)).ToList();