我有一个对象列表,我们称这些对象为People。每个人都有他们要求的假期清单。我正在尝试创建一个Linq查询,以找出有多少人要求同一个假期。我没有运气。有什么建议,或者是朝正确的方向推?
答案 0 :(得分:1)
您可以创建这样的类:
Order
,然后获得每天预订的人的列表,如下所示:
OrderItem
答案 1 :(得分:0)
这应该有帮助:
class Customer
{
List<Vacation> vacationDays {get; set;}
}
public class Vacation : IEquatable<Vacation>
{
public string Name { get; set; }
public int VacationId { get; set; }
public override string ToString()
{
return "ID: " + VacationId + " Name: " + Name;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
Vacation objAsVacation = obj as Vacation;
if (objAsVacation == null) return false;
else return Equals(objAsVacation);
}
public override int GetHashCode()
{
return VacationId;
}
public bool Equals(Vacation other)
{
if (other == null) return false;
return (this.VacationId.Equals(other.VacationId));
}
// Should also override == and != operators.
}
现在,您可以在此处使用SelectMany
此处的Contains
上的更多信息:
答案 2 :(得分:0)
首先将列表弄平。这段代码将创建一个单独的非嵌套列表,其中每个人/日期都包含一行:
var flatList = people.SelectMany
(
p => p.VacationDays.Select( d => new { Person = p, Date = d } )
);
然后,您可以轻松地过滤所需的任何方式:
var lookFor = DateTime.Parse("1/1/2019");
var entriesForJan01 = flatList.Where( f => f.Date == lookFor );
点击此链接可获得working example on DotNetFiddle
答案 3 :(得分:0)
这可以使用LINQ通过多种方式完成,但是如果您想对多个日期进行查找,我想提出一个更有效的解决方案。我的解决方案使用Dictionary<DateTime,int>
作为我们遇到的日子的计数器。由于Dictionary
查找具有恒定的时间复杂度(O(1)),因此当您需要检查多个日期甚至所有日期的出现次数时,此解决方案将非常有效。
var dateOccurrences = new Dictionary<DateTime, int>();
foreach (var vacationDate in people.SelectMany(p => p.Vacations))
{
//check if we already have this date in the dictionary
if (!dateOccurrences.TryGetValue(vacationDate.Date, out int previousOccurrences))
{
//never seen before
previousOccurrences = 0;
}
//add one occurrence
dateOccurrences[vacationDate] = previousOccurrences + 1;
}
现在进行查找,只需再次使用TryGetValue
。另外,您可以foreach
浏览所有词典条目:
foreach (var pair in dateOccurrences)
{
Console.WriteLine(pair.Key);
Console.WriteLine(pair.Value);
}