在C#中需要Linq过滤方面的帮助

时间:2010-07-27 16:00:03

标签: c# linq

我所拥有的是一个名为HourList的集合,它由Hour对象组成。一小时的两个属性是EmployeeId和Hours。员工进出并创建一小时记录。因此,在一周结束时,我将从DAO为多名员工提供一份mulipple Hour对象的HourList。要求在仅显示总小时数超过给定阈值的员工的情况下进行报告。

示例:一个简单而扁平的HourList

Id | Hours
----------
1  | 4.5
2  | 6.0
3  | 9.9
1  | 5.5
2  | 2.5

阈值是10.在这种情况下,我只想要一个Id 1小时的记录,因为他的总计小时数超过10个。

我知道我可以通过在返回初始HourList时创建一个新的DAO方法来处理这个问题。我也可以使用foreach语句非常低效地完成这项工作。我试图通过Linq变得更好,并希望看到什么是可能的。感谢您提前提供任何帮助。

3 个答案:

答案 0 :(得分:4)

var filtered = HourList.GroupBy(h => h.id)
                       .Select(g => new { Id = g.Key,
                                          Hours = g.Sum(h => h.Hours)
                                        })
                       .Where(h => h.Hours >= 10);

无法测试,但这应该让你接近。

答案 1 :(得分:2)

这是一个简单的例子,可以完成您的工作:

   class Program
    {
        public class HourEntry
        {
            public int Id { get; set; }
            public int Hours { get; set; }
        }

        static void Main(string[] args)
        {
            List<HourEntry> hours = new List<HourEntry>
            {
                new HourEntry { Id = 1, Hours = 3 },
                new HourEntry { Id = 2, Hours = 4 },
                new HourEntry { Id = 3, Hours = 3 },
                new HourEntry { Id = 1, Hours = 8 },
                new HourEntry { Id = 5, Hours = 2 },
                new HourEntry { Id = 3, Hours = 2 },
                new HourEntry { Id = 3, Hours = 6 },
                new HourEntry { Id = 9, Hours = 2 },
                new HourEntry { Id = 4, Hours = 2 },
            };


            var moreThanTen = from h in hours
                              group h by h.Id into hGroup
                              where hGroup.Sum(hg => hg.Hours) > 10
                              select hGroup.Key;

            foreach (var m in moreThanTen)
            {
                Console.WriteLine(m);
            }
        }
    }

答案 2 :(得分:1)

        var hourList = new List<Hour>() 
        { 
            new Hour() { Id = 1, Hours = 4.5M},
            new Hour() { Id = 2, Hours = 6M},
            new Hour() { Id = 3, Hours = 9.9M},
            new Hour() { Id = 1, Hours = 5.5M},
            new Hour() { Id = 2, Hours = 2.5M}
        };

        var over10 = hourList.GroupBy(h => h.Id).Select( h => new { Id = h.Key, Sum = h.Sum( s => s.Hours )}).Where( x => x.Sum >= 10 );