C#在包含另一个列表的对象列表中查找重复属性

时间:2019-02-12 23:00:06

标签: c#

我有一个对象列表,我们称这些对象为People。每个人都有他们要求的假期清单。我正在尝试创建一个Linq查询,以找出有多少人要求同一个假期。我没有运气。有什么建议,或者是朝正确的方向推?

4 个答案:

答案 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

https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.selectmany?view=netframework-4.7.2

此处的Contains上的更多信息:

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.contains?view=netframework-4.7.2

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