2012-07-09 2 views
4

List<string>을 포함하는 사용자 지정 데이터 형식이 있습니다.목록 <string>의 속성을 가진 목록 <T>을 중첩 목록으로 그룹화하는 방법은 무엇입니까?

CustomDataType 인 그룹을 List<string>으로 그룹화하고자합니다.

나는 Timepoints 문자열로 표현 날짜 목록은 다음

compoundSchedules.GroupBy(a => a.Timepoints); 

을 시도했습니다. CustomDataType에 동일한 시간대가있는 경우 함께 분류되기를 바랍니다. 위의 코드를 사용하여 코드를 그룹화하지 않고 그 대신 이 CustomDataType이고 그 시간대 목록이 IGroupingKey으로 반복됩니다.

감사합니다.

+2

은 'Timepoints'입니까? 그렇다면 어쩌면 같은 날짜이지만 시간이 다를 수 있습니다. 이것은 정확히 동일한 것으로 그룹화되지 않기 때문에 발생합니다. –

+2

제목 참조,'Timepoints'는'List '입니다. – kaveman

+1

시간을 datetime으로 저장해야 할 때 문자열로 저장하고 있습니까? –

답변

2

당신은 목록이 동일한 길이와 내용이 있는지 확인하는 IEqualityComparer<List<string>>를 만들고, Enumerable.GroupBy의이 오버로드를 사용한다 GetHashCodeEquals (및/또는 IEquatable<T>을 구현)을 구현하고 default comparer에서 사용합니다.

1

TimepointsList<string>이므로 하나의 집계 문자열과 그룹을 구성합니다. 집계 방법을 사용하여이 작업을 수행 할 수 있습니다.

compoundSchedules.GroupBy(a => a.Timepoints.Aggregate((x,y) => x + y)); 
+0

'Timepoints'의 문자열이 동일하지만 순서가 다른 경우 어떻게해야합니까? 그것이 OP의 시나리오에서 가능하다면, 집계 전에 정렬되었는지 확인해야합니다. 그래도 문제의 조건을 고려할 때 나쁜 제안은 아닙니다. – FishBasketGordo

2

두 가지 사항을 염두에 두십시오. 첫 번째는 Timepoints 클래스를 만들고 IComparable을 구현하는 것입니다. 그런 다음 각 목록의 각 요소를 비교하여 해당 목록이 동일한 지 확인할 수 있습니다. 또는 복합 스케줄에서 목록의 해시 코드를 보유하는 새 속성을 만들 수 있습니다.

0

당신은 할 수 문자열의 결합 된 목록을 그룹화 : (이 원하는 경우) 이것은 또한 같은 순서로 돌볼 것

var grouped = compoundSchedules.GroupBy(cs => string.Join("", cs.Timepoints)); 

. ,

compoundSchedules.GroupBy(a => a.Timepoints, myComparer); 

어느 쪽이든, 또는 시점들 목록으로 자신의 클래스를 생성 :

+0

'[ "Hello world"]'와'[ "Hello", "world"]'는이 정의에서 같은 문자열입니다. –

+0

@TimS : 네 말이 맞아. 그러나'Timepoints '는 단지 "난독 화 된"날짜 시간의 목록 일 뿐이므로 작동해야합니다. 나는 "Hello world"가 유효한 DateTime이 아니라고 가정했다. –

+0

@TimS. 시간대가 Datetime을 나타냅니다.이 상황에서 발생할 가능성은 거의 없습니다. – Aducci

관련 문제