2016-10-10 3 views
-1

IGrouping이 그룹화되어있는 Key을 대체 할 수 있습니까?IGrouping의 키를 교체 하시겠습니까?

var groups = orders.GroupBy(o => new { o.Date.Year, o.Date.Month }); 

을하지만 지금 내 그룹화 키가 익명의 유형은 다음과 같습니다

나는 현재이 같은 익명의 유형으로 그룹화하고 있습니다. 이 그룹화 키를 재정의 된 ToString 메서드가있는 정의 된 형식 인 "YearMonth"로 바꾸고 싶습니다.

public class YearMonth 
{ 
    public int Year { get; set; } 
    public int Month { get; set; } 

    public override string ToString() 
    { 
     return Year + "-" + Month; 
    } 
} 

그룹 키를 바꿀 수있는 방법이 있습니까? 또는 새로운 그룹 키를 사용하여 기존 IGrouping에서 새로운 IGrouping을 만들 수 있습니까?

+4

는 왜 한 종류의 그룹 하시겠습니까을하고 대신 키를 변경 실제로 * 갖고 싶은 열쇠를 그룹으로 묶어서? – Servy

+4

대신'YearMonth'가 적절하게'Equals'와'GetHashCode'를 오버라이드하는 한'o => new YearMonth (o.Date.Year, o.Date.Month)'를 사용하십시오. 적어도 LINQ to Objects 용. –

+2

좋은 이유 때문에'readonly'이며, 나중에 동일한 객체를 식별하는 데 사용 된 것을 수정하면 안됩니다. –

답변

1

글쎄 개인적으로 나는 단지 문자열 값을 그룹으로 묶을 것이다.

또 다른 간단한 옵션은 일정한 일을 사용하여 달 나타내는 날짜를 생성하는 것입니다 :

orders.GroupBy(o => new DateTime (o.Date.Year, o.Date.Month, 1)) 

그럼 당신은 내장되어 값 평등과 문자열 서식.

당신은 만들 수 YearMoth 또한 당신에게 가치 평등의 의미를 줄 것이다 불변 구조체 :

public struct YearMonth 
{ 
    public readonly int Year; 
    public readonly int Month; 

    public YearMonth(int year, int month) 
    { 
     Year = year; 
     Month = month; 
    } 

    public override string ToString() 
    { 
     return Year + "-" + Month; 
    } 
} 
+0

이것은 꽤 좋아 보인다! 왜 문자열 값으로 그룹화하려고합니까? 이렇게하면 모든 데이터를 그대로 유지하고 강력하게 입력 할 수 있습니다. –

+0

문자열 값 이외에 다른 것에 관심이 있습니까? 당신은 달과 해를 별도로 필요로합니까? 문자열은 대/소문자 구분, 공백 등에 대해 걱정할 필요가 없다면 다른 유형과 마찬가지로 그룹화 키와 마찬가지로 유효합니다. 문자열 형식을 제어하면 문제가되지 않으므로 문자열을 제어하십시오. 내가 말했듯이, 그것은 내가 다른 것을 할 강력한 이유가있을 때까지 내가 할 것입니다. –

+0

나는 문자열이 모두 지금 _ _ 필요하다고 생각하지만, 어딘가에 별도의 데이터가있는 줄이 유용 할 수도 있습니다. 나는 "지금 당장은 필요 없다"는 이유로 다리를 태우고 싶지 않습니다. –

관련 문제