이 이러한 유형의 문제에 직면 할 때 내가 무슨 짓을했는지 있습니다 :
var rooms = bookings
.Select(b => b.Room)
.Distinct()
.OrderBy(r => r)
.ToArray();
var query = (
from b in bookings
group b by b.Date into gbs
let l = gbs.ToLookup(gb => gb.Room, gb => gb.Count)
select new
{
Date = gbs.Key,
RoomCounts = rooms.Select(r => l[r].Sum()).ToArray(),
}).ToArray();
이 기본적으로 다음과 같은 배열을 생성합니다
var rooms = new []
{
"Room A", "Room B", "Room C", "Room D", "Room E", "Room F",
};
var query = new []
{
new
{
Date = new DateTime(2011, 01, 01),
RoomCounts = new [] { 2, 5, 3, 2, 1, 5 }
},
new
{
Date = new DateTime(2011, 01, 02),
RoomCounts = new [] { 3, 5, 2, 5, 2, 2 }
},
new
{
Date = new DateTime(2011, 01, 03),
RoomCounts = new [] { 2, 5, 2, 0, 0, 0 }
},
};
RoomCounts
배열은 모두 rooms
배열과 동일한 길이이고 각 인덱스 위치의 값은 rooms
배열의 방과 일치합니다.
일반적으로 상당히 효과적입니다.
대신 스프레드 시트와 같이 그리드를 나타내는 배열 배열을 만드는 방법이 있습니다.
Func<object, IEnumerable, object[]> prepend = (o, os) =>
(new object[] { o }).Concat(os.Cast<object>()).ToArray();
Func<object[], IEnumerable<object[]>, object[][]> prepends = (o, os) =>
(new object[][] { o }).Concat(os).ToArray();
var query2 = prepends(prepend("Date", rooms),
from b in bookings
group b by b.Date into gbs
let l = gbs.ToLookup(gb => gb.Room, gb => gb.Count)
select prepend(gbs.Key, rooms.Select(r => l[r].Sum())));
의이 양식을 :
var q2 = new object[]
{
new object[] {
"Date", "Room A", "Room B", "Room C", "Room D", "Room E", "Room F" },
new object[] { new DateTime(2011, 01, 01), 2, 5, 3, 2, 1, 5 },
new object[] { new DateTime(2011, 01, 02), 3, 5, 2, 5, 2, 2 },
new object[] { new DateTime(2011, 01, 03), 2, 5, 2, 0, 0, 0 },
};
쿼리가 약간 털이 보이는 경우 대안에 대한 대안은,이 작업을 수행하는 것입니다
var query2 = (new object[]
{
(new object[] { "Date" })
.Concat(rooms.Cast<object>())
.ToArray()
}).Concat(
from b in bookings
group b by b.Date into gbs
let l = gbs.ToLookup(gb => gb.Room, gb => gb.Count)
select (new object[] { gbs.Key })
.Concat(rooms.Select(r => l[r].Sum()).Cast<object>())
.ToArray())
.ToArray();
이
이 (가) 다음과 같은 생산 쿼리는 여전히 동일한 그리드의 오브젝트를 생성하지만, 첫 번째 형식보다 조금 더 읽기 쉽다.
이 정보가 도움이되기를 바랍니다.
감사합니다. 시도했습니다. – user918064
감사합니다. 결과를 Silverlight Datagrid에 바인딩합니다. 옵션 1은 날짜가있는 열과 텍스트가없는 roomcount가있는 7 줄만 표시합니다. 옵션 2는 .Concat에서 오류를 발생시킵니다 (예약 섹션의 b에서 객체에 concat에 대한 정의가 없음을 말함) 옵션 3이 가장 잘 보이지만 각 행을 배열로 나눠서 어떻게 바인딩 할 수 있는지 알 수 없습니다. itemsource 속성을 가진 DataGrid? 나는 아마 명백한 것을 놓치고 있습니까? – user918064