2011-08-11 5 views
2

내가 바보가 된 기분 필드로 그룹화 얻을,하지만 난 어떻게 9시 아침 식사 만 얻을 수있는 정답 상황Linq에는 별개의 요소는

public class Foo 
{ 
    public string Name { get; set; } 
    public string Time { get; set; } 

    public Foo(string name, string time) 
    { 
     Name = name; 
     Time = time; 
    } 
} 

var o = new List<Foo> 
        { 
         new Foo("Breakfast","9:00"), 
         new Foo("Lunch", "12:00"), 
         new Foo("Breakfast", "8:00") 
        }; 

을 찾기 위해 겉으로는 쉬운 당신의 도움이들 필요, 인정해야 : 00 및 점심 식사, 8시에 아침 식사는 포함되지 않습니까?

나는 그렇게 시작 :

var a = o.GroupBy(x => x.Name); 

그러나 그것은 당신에게 내가 너무 시간이 필요 단지 이름을 줄 것이다.

var a = o.GroupBy(x => x.Name) 
     .Select(g => g.First()); 

또는 당신은 DistinctByMoreLINQ에서 사용할 수 있습니다 :

답변

5
var a = o.GroupBy(x => x.Name).Select(g => g.First()) 

하지만 .First() 호출에 대해 생각해보십시오. 둘 이상의 요소가있을 때 올바른 요소를 선택하려면 어떻게해야합니까? 요소를 정렬하여 최신/가장 빠름을 얻거나 요구 사항이 무엇이든간에 원하는 요소를 정렬 할 수 있습니다.

+0

"올바른"것을 고려할 때 좋은 점. 최신 버전은 확실하지 않지만 LINQ-to-EF 4.0에서는'OrderBy()'없이'First()'를 사용할 수 없습니다. 많은 의미. – dlev

3

하나의 옵션은 후자는 메모리에 더 효율적이다

var a = o.DistinctBy(x => x.Name); 

, 그리고 첫 번째 방법은 가지고있는 반면, 즉시 항복 결과를 시작합니다 모두 데이터를 반환하기 전에 데이터를 반환 할 수 있습니다. 한편, 후자는 MoreLINQ (또는 코드 복사)가 필요합니다.

편집 : 여기서 이라고 가정하고LINQ to Objects (MoreLINQ는 확실히 다른 제공 업체에서 작동하지 않으므로) 해당 그룹을 대표하는 그룹의 첫 번째 발생에 만족해야합니다.

0

다음과 같은 이유는 무엇입니까? (코드를 조금 더 작게 만들 수있는 자유를 얻었습니다. 속성이 public이므로 생성자가 필요하지 않지만 대신 object-initializer 구문을 사용할 수 있습니다.이 모든 작업은 LinqPad에서 수행해야합니다.

void Main() { 
    var os = new [] { 
     new Foo{Name="Breakfast",Time="9:00"}, 
     new Foo{Name="Lunch", Time="12:00"}, 
     new Foo{Name="Breakfast", Time="8:00"} 
    }; 

    os.Where(o => DateTime.Parse(o.Time).Hour > 8).Dump(); 
} 

public class Foo 
{ 
    public string Name { get; set; } 
    public string Time { get; set; } 
}