C#LINQ使用值列表按子列表过滤复杂对象列表

时间:2019-09-26 19:52:01

标签: c# linq

我想返回在请求状态下打折的活动组的列表。组列表每个都有一个状态列表,其中包括状态缩写和折扣标志。

过滤条件:

string[] states  //list of state abbreviations

要过滤的列表:

public class WorksiteGroup
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public bool IsDiscontinued { get; set; }
    public List<WorksiteGroupState> ActiveStates { get; set; } = new List<WorksiteGroupState>();
}

public class WorksiteGroupState
{
    public string StateAbbrev { get; set; }
    public bool IsDiscountApplied { get; set; }
}

同样,我想返回一个具有以上完整结构的WorksiteGroup列表,其中IsDiscontinued为false,并具有ActiveState,其中StateAbbrev匹配任何过滤条件(states []),而IsDiscountApplied对于该状态为true。

3 个答案:

答案 0 :(得分:1)

您可以使用Linq进行尝试:

try:
    last = 'i'
    i = int('10')
    last = 'j'
    j = int('ten')
except ValueError:
    print(f'Please enter an integer as {last}')

您可以玩游戏并添加更多内容以查看结果。

答案 1 :(得分:1)

让我们逐步进行操作,然后我们可以在必要时合并操作。

  

我想返回上面具有完整结构的WorksiteGroup列表   IsDiscontinued为假

source.Where(e => !e.IsDiscontinued);
  

并具有一个ActiveState,其中StateAbbrev与任何过滤器匹配   条件(状态[])

现在让我们采用上一个管道并将此条件链接到其中。

source.Where(e => !e.IsDiscontinued)
      .Where(e => e.ActiveStates.Any(a => states.Contains(a.StateAbbrev)))
  

IsDiscountApplied在该状态下为真。

source.Where(e => !e.IsDiscontinued)
      .Where(e => e.ActiveStates.Any(s => states.Contains(s.StateAbbrev) && s.IsDiscountApplied));

为了提高效率,我们将Contains调用换成s.IsDiscountApplied之后,例如

source.Where(e => !e.IsDiscontinued)
      .Where(e => e.ActiveStates.Any(s => s.IsDiscountApplied && states.Contains(s.StateAbbrev)));

答案 2 :(得分:0)

sudo代码,但是会像下面这样工作,我确定您可以做到这一点,但是

<date variable>|date('d/m/Y')