【问题标题】:LINQ: Get an item that is not in the records - C#LINQ:获取不在记录中的项目 - C#
【发布时间】:2016-08-03 22:51:01
【问题描述】:

这是我的POST 回复的一个扩展问题

class EmployeeSchedule
{
   public int Id { get; set; }
   public string Name { get; set; }
   public DateTime WorkDate { get; set; }
   public bool isOff { get; set; }
}

现在在这种情况下,我想从列表中的4/12/2016 中找到一个WorkDate 未找到的Id 作为我的标准。

List<Staff> workers = new List<Staff>()
{
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false},
    new Staff { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false},
    // new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false},
    new Staff { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false},
};

到目前为止,我已经尝试过这段代码:

var notInDate = workers.Where(x => !workers.Any(y => Convert.ToDateTime("4/12/2016") != x.WorkDate));

foreach (var item in notInDate)
{
    Console.WriteLine(item.Id + " " + item.WorkDate.Date);
}

其输出为:ID :1 WorkDate: 4/12/2016 12:00:00 AM

还有这个输出:

var notInDate = workers.Where(x => workers.Any(y => Convert.ToDateTime("4/12/2016") != x.WorkDate));

ID :1 WorkDate: 4/11/2016 12:00:00 AM
ID :1 WorkDate: 4/13/2016 12:00:00 AM
ID :1 WorkDate: 4/14/2016 12:00:00 AM
ID :1 WorkDate: 4/15/2016 12:00:00 AM
ID :1 WorkDate: 4/16/2016 12:00:00 AM
ID :1 WorkDate: 4/17/2016 12:00:00 AM
ID :2 WorkDate: 4/11/2016 12:00:00 AM
ID :2 WorkDate: 4/13/2016 12:00:00 AM
ID :2 WorkDate: 4/14/2016 12:00:00 AM
ID :2 WorkDate: 4/15/2016 12:00:00 AM
ID :2 WorkDate: 4/16/2016 12:00:00 AM
ID :2 WorkDate: 4/17/2016 12:00:00 AM

第二个例子刚刚删除了WorkDate is 4/12/2016的记录

我想得到谁的Id = 2,因为那个Id没有4/12/2016WorkDate

【问题讨论】:

  • 要求不够明确,
  • 我会尽力澄清我的问题,先生
  • 从我在发布的数据中看到的 ID 为 1,其 WorkDate 也为 2016 年 4 月 12 日,您不想要那个,只需要 ID 为 2 的那个吗?
  • @DavidY 是,因为Id = 2 没有给定 WorkDate 条件的记录。

标签: c# linq ienumerable enumerable


【解决方案1】:

如果您想要当天没有工作的人的所有条目,您需要按 id 分组(以获取每个人的组)并过滤不包含日期的各个组。类似的东西;

var notInDate = 
         // Create a group per employee
  workers.GroupBy (x => x.Id)
         // Keep only groups that didn't work
         .Where (x => !x.Any (y => y.WorkDate == Convert.ToDateTime ("4/12/2016")))
         // Get only the key for each group
         .Select (x => x.Key);

【讨论】:

  • 它仍然是Id = 2 的列表,但我通过编辑您对此var notInDate = // Create a group per employee workers.GroupBy(x =&gt; x.Id) // Keep only groups that didn't work .Where(x =&gt; !x.Any(y =&gt; y.WorkDate == Convert.ToDateTime("4/14/2016"))) // Flatten the groups back to rows .Select(x =&gt; x.Key); 的答案获得了结果
  • 我想接受这个答案,请用我建议的代码更新它
【解决方案2】:

您可以这样做,使用GroupById 进行分组,然后使用Any 扩展验证员工是否在该日期工作..

var notInDate = workers.GroupBy(g=>g.Id)
                       .Where(x => !x.Any(y => DateTime.ParseExact("4/12/2016","M/d/yyyy", null) == y.WorkDate))
                       .FirstOrDefault();  // Get the first matching staff.
if(notInDate != null)
{
    id = notInDate.Key; // StaffId
}   

【讨论】:

  • 太好了,很高兴它对您有所帮助。
  • 先生,它产生了不同的结果,但我批准了 Joachim 的回答
  • 它有效,但我更喜欢上面的答案先生,非常感谢!
  • 别担心,我很高兴它帮助了你。
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多