2012-08-29 3 views
1

나는 IList <에 항목 목록을 가지고 있습니다. 각 listitem에는 날짜와 몇 가지 다른 필드가 있습니다. 목록을 날짜순으로 정렬 한 다음 첫 번째 항목의 날짜 만 표시하도록 목록을 변경하고 날짜가 반복 될 경우 다른 항목의 날짜 필드를 null로 효과적으로 설정해야합니다.Linq Group 목록을 변경하려면

예 :

12/01/2012 500 
12/01/2012 700 
15/02/2012 900 
15/02/2012 1100 
27/05/2012 2000 

원하는 결과 :

12/01/2012 500 
null  700 
15/02/2012 900 
null  1100 
27/05/2012 2000 

가함으로써 LINQ의 그룹화 및 주문이 가능한가?

감사합니다.

답변

0

LINQ 운영자는 기본 데이터를 변경하지 않아야합니다. 데이터를 수정하려면 일반 foreach을 사용하는 것이 좋습니다.

아마 작동합니다 : 당신이해야하기 때문에 이러한 구조를 사용하지 않는 것

var groups = items.GroupBy(x => x.Date).ToArray(); 
foreach (var group in groups) 
{ 
    foreach (var item in group.Skip(1)) item.Date = null; 
} 

GroupBy이 순서를 유지하는 것이 한 번 확인.

var sortedItems = items.OrderBy(x => x.Date); 
var lastVisitedDate = (DateTime?) null; 
foreach (var item in sortedItems) 
    if (Equals(item.Date, lastVisitedDate)) item.Date = null; 
    else lastVisitedDate = item.Date; 
+0

을, 나는 그것을 곧 시도 할 것이지만, 정렬은 잘 작동한다. 감사! –

0

이 작동합니다 :

var list = new List<DateItem>(); 
// Initialization ... 
var dups = list.Select((Item,Index) => new{ Item,Index }) 
       .GroupBy(x => x.Item.Date) 
       .Where(g => g.Count() > 1); 
foreach(var dup in dups) 
{ 
    foreach (var nullable in dup.OrderBy(x => x.Item.Date).Skip(1)) 
    { 
     list[nullable.Index].Date = null; 
    } 
} 

수업이 비슷합니다 가정 대신 나는 이런 식으로 뭔가를 사용하는 것이

class DateItem { 
    public DateTime? Date; 
    public int OtherField; 
} 

편집 : 여기에 작동하는 데모입니다 : http://ideone.com/cVL4G

0

편도 t 오 추종자 모두를 얻을 수 LINQ를 사용하고 자신의 날짜를 설정 null로 루프 :

// Use ToList() to make sortedItems non-lazy so it won't get ordered each time it's called. 
var sortedItems = items.OrderBy(x => x.Date).ToList(); 
var followers = sortedItems.GroupBy(item => item.Date) 
          .SelectMany(group => group.Skip(1)); 
foreach (var follower in followers) 
{ 
    follower.Date = null; 
} 
// Now you can use sortedItems. 

를 또는 쿼리 구문을 선호하는 경우 : 내가하여 그룹을 사용하지 않은

var followers = from item in sortedItems 
       group item by item.Date into grp 
       from follower in grp.Skip(1) 
       select follower;