【问题标题】:How can I use a list in Where of lambda function c#?如何在 lambda 函数 c# 的 Where 中使用列表?
【发布时间】:2021-03-04 13:31:44
【问题描述】:

我现在有这段代码,我想使用周末列表而不是静态日期 SundaySaturday 。如何在项目z.DayOfWeek和周末列表之间使用相等函数。

    DateTime start = new DateTime(2021,3,3);
    DateTime end = new DateTime(2021,3,27);
    
    List<DateTime> blackOut = new List<DateTime>
    {
        new DateTime(2021,3,10),
        new DateTime(2021,3,11)
        
    };
    
var days = Enumerable.Range(0, (int)(end - start).TotalDays)
          .Select(x => start.AddDays(x))
          .Where(z => z.DayOfWeek != DayOfWeek.Saturday && 
                      z.DayOfWeek != DayOfWeek.Sunday &&
                      !blackOut.Contains(z))
          .Count();

假设我有一个包含周末的列表周末列表,我尝试过的是:

List<string> weekendslist = new List<string>();
weekendslist.Add(DayOfWeek.Saturday.ToString());
weekendslist.Add(DayOfWeek.Sunday.ToString());
var days = Enumerable.Range(0, (int)(end - start).TotalDays)
          .Select(x => start.AddDays(x))
          .Where(z => weekendslist.Contains(z.DayOfWeek.ToString())
                      !blackOut.Contains(z))
          .Count();

但这对我不起作用。任何人都知道我该怎么做才能做到这一点?

参考:How to exclude blackout days from a specific duration between two dates chosen from a two Datepicker? C#

【问题讨论】:

  • 创建一个工作日列表,然后拨打Where(x =&gt; theList.Contains(x))?您在这里遇到了什么具体问题?
  • 你能给我解释一下你的方法吗?
  • 你好像忘了否定你的weekendslist.Contains。目前你只有周末。
  • 要关注@TimSchmelter 的评论,请使用我的答案中的代码,而不是使用静态列表,而是使用类似myListOfInts.Select(myInt =&gt; (DayOfWeek)myInt)

标签: c# list lambda


【解决方案1】:

以下代码与您的尝试相同,仅使用DayOfWeek 枚举值而不是字符串,并正确否定Contains

DateTime start = new DateTime(2021, 3, 3);
DateTime end = new DateTime(2021, 3, 27);
List<DateTime> blackOut = new List<DateTime>
{
    new DateTime(2021, 3, 10), 
    new DateTime(2021, 3, 11)
};
List<DayOfWeek> weekendslist = new List<DayOfWeek>
{
    DayOfWeek.Saturday,
    DayOfWeek.Sunday
};
var days = Enumerable
    .Range(0, (int)(end - start).TotalDays)
    .Select(x => start.AddDays(x))
    .Where(z => 
           !weekendslist.Contains(z.DayOfWeek) && 
           !blackOut.Contains(z))
    .Count();
Console.WriteLine(days);

【讨论】:

【解决方案2】:

Enum.IsDefined怎么样?

enum Weekends
{
    Saturday,
    Sunday
}
var days = Enumerable.Range(0, (int)(end - start).TotalDays)
    .Select(x => start.AddDays(x))
    .Where(z => Enum.IsDefined(typeof(Weekends), z.DayOfWeek.ToString()) &&
                !blackOut.Contains(z))
    .Count();

或者另一种选择是为DayOfWeek写一个扩展

public static class WeekendExtension
{
    public static bool IsWeekend(this DayOfWeek dayOfWeek)
    {
        return dayOfWeek == DayOfWeek.Saturday || 
            dayOfWeek == DayOfWeek.Sunday;
    }
}
var days = Enumerable.Range(0, (int)(end - start).TotalDays)
    .Select(x => start.AddDays(x))
    .Where(z => !z.DayOfWeek.IsWeekend() &&
                !blackOut.Contains(z))
    .Count();

【讨论】:

  • 感谢您的回答,但问题是 Enum 是不变的,但是,周末列表每次都可以更改。
  • 我该如何解决这个错误?? Extension method must be defined in a non-generic static class
  • 如果我们正在射击一个移动的目标,我需要你以我能理解的方式解释这个问题。措辞上,您的问题是在谈论“排除周末”,这意味着您希望排除的日子是不变的。我不明白这个问题。
  • 放入静态类。我相应地编辑了我的答案。
  • 我的问题很明确,我正在寻找一种方法,在 Where lambda 函数中使用 equals 运算符将列表与项目进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多