4

IEnumerable<Object>たとえば、週ごとにグループ化するクエリを実行しようとしています。

Project(Name, DateStart,ID)

IEnumerable<Project>週ごとにグループ分けして、レポートを作成したいと思っています。

例:

Week 1
 Project1  8/4/2013 ID1
 Project2  9/4/2013 ID2
Week 2
 Project1  16/4/2013 ID3
 Project2  18/4/2013 ID5
Week 3
 Project1  24/4/2013 ID7
 Project2  26/4/2013 ID8

誰かが私に手を差し伸べることができれば、本当に感謝しています!ラムダ式を実行しようとしましたが、成功しませんでした。

ありがとう!

4

6 に答える 6

14
var weekGroups = projects
    .Select(p => new 
    { 
        Project = p, 
        Year = p.DateStart.Year, 
        Week =  CultureInfo.InvariantCulture.Calendar.GetWeekOfYear
                      (p.DateStart, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
    })
    .GroupBy(x => new { x.Year, x.Week })
    .Select((g, i) => new 
    { 
        WeekGroup = g, 
        WeekNum = i + 1,
        Year = g.Key.Year,
        CalendarWeek = g.Key.Week
    });

foreach (var projGroup in weekGroups)
{
    Console.WriteLine("Week " + projGroup.WeekNum);
    foreach(var proj in projGroup.WeekGroup)
        Console.WriteLine("{0} {1} {2}", 
            proj.Project.Name, 
            proj.Project.DateStart.ToString("d"), 
            proj.Project.ID);
}
于 2013-04-10T14:01:52.457 に答える
1

日付がどの週にあるかを判断できる関数を定義する必要があります。

int GetWeek(DateTime date) { ... }

次に、グループ化する LINQ クエリは次のとおりです。

IEnumerable<IGrouping<int, Project>> groupedProjects = 
         myListOfProjects.GroupBy(p => GetWeek(p.DateStart));

グループ化されたプロジェクト リストを反復処理できます。

foreach (var weekGroup in groupedProjects)
{
    int week = weekGroup.Key;
    foreach (var project in weekGroup)
    {
        Console.WriteLine("Week " + week + " | Project: " + project.ID);
    }
}
于 2013-04-10T13:46:57.770 に答える
0

このタスクを簡素化するために、WeekNumber プロパティを Project クラスに追加し、WeekNumber プロパティで簡単にグループ化した後、Project のオブジェクトを作成するときにそれを埋めることができると思います

Project(Name, DateStart,ID,WeekNumber)
于 2013-04-10T13:46:41.983 に答える
0

単純な投影だけで十分だと思います:

// we'll just use the existing settings on the box.
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
var cal = dfi.Calendar;

var Projects = GetProjectsFromSomewhere(); // assuming IEnumerable<Project>

int week = 1; // this *could* be changed and projected in the Select instead.
foreach (var wg in from p in Projects
    group p by cal.GetWeekOfYear(
        p.StartDate, dfi.CalendarWeekRule, dfi.FirstDayOfWeek))
{
    Console.WriteLine("Week {0}", week);

    foreach (var p in wg)
    {
        Console.WriteLine("    {0} {1} {2}", p.Name, p.StartDate, p.ID);
    }
    week++;
}
于 2013-04-10T14:17:29.877 に答える
0

ここGetWeekOfMonthに投稿された拡張機能を使用できます:

そして、次のようなことをします:

        var groups = projects.GroupBy(p => p.Start.GetWeekOfMonth());

        foreach (var group in groups)
        {
            Console.WriteLine("Week {0}", group.Key);
            foreach (var project in group)
            {
                Console.WriteLine("\t{0} | {1:dd/MM/yyyy} | {2}", 
                     project.Name, project.Start, project.Id);
            }
        }
于 2013-04-10T14:04:42.750 に答える