LINQ-使用布尔方法的Where子句

时间:2019-02-01 16:59:18

标签: c# linq boolean where

我有以下课程。我的目标是根据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)))

2 个答案:

答案 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();