2014-09-07 2 views
0

나는 컬렉션의 클래스가 있으며 컬렉션의 각 클래스에는 세 개의 속성이 있지만 클래스 컬렉션의 속성 중 두 개씩 구분해야합니다. 혼란스러운 부분은 내가 두 속성에 의해서만 구별 된 후에 세 속성 모두가 필요하다는 것입니다. 예를 들어 구분되는 대부분의 속성은 별개의 속성을 사용하여 무의미한 형식을 만들지 만 고유 한 작업 후에 항목 컬렉션에 있어야하는 제 3의 속성을 제거합니다. 세 가지 속성 중 두 가지로 구분할 수 있지만 최종 결과는 세 가지 속성을 모두 포함하는 클래스의 컬렉션입니까? 수업 :C# LINQ - 두 속성을 구분하지만 클래스의 모든 속성을 유지하는 방법

public class Foo 
{ 
public int PropertyOne {get; set;} 
public int PropertyTwo {get; set;} 
public string PropertyThree {get; set;} 
} 

// fake example of what I want but 
// final result has all three properties in the collection still 
var finalResult = allItems.DistinctBy(i => i.PropertyOne, i.PropertyTwo).ToArray(); 

어떤 도움을 주셔서 감사합니다!

+0

실제로 익명 형식을 만들려고 했습니까? 이것은 단지 그룹화를위한 키로 사용됩니다 ... src의 항목이 람다를 사용하여 출력 순서로 투영되지 않으면 변경되지 않습니다. 시도 해봐. – spender

+1

IEqualityComparer를 만들고 LINQ의 Distict 메서드를 사용하지 않는 이유는 무엇입니까? – Tsef

+2

@zaf :'IEqualityComparer '를 생성하는 것은'source.GroupBy (keySelector) .Select (g => g.First())'와 같이 쉽게 기술 할 수있는 오버 헤드와 비슷합니다. – spender

답변

5

당신이 implementation of .DistinctBy 보면 : 당신이 !NO_HASHSET 구현을 보면

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source, 
     Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) 
    { 
#if !NO_HASHSET 
     var knownKeys = new HashSet<TKey>(comparer); 
     foreach (var element in source) 
     { 
      if (knownKeys.Add(keySelector(element))) 
      { 
       yield return element; 
      } 
     } 
#else 
     // 
     // On platforms where LINQ is available but no HashSet<T> 
     // (like on Silverlight), implement this operator using 
     // existing LINQ operators. Using GroupBy is slightly less 
     // efficient since it has do all the grouping work before 
     // it can start to yield any one element from the source. 
     // 

     return source.GroupBy(keySelector, comparer).Select(g => g.First()); 
#endif 
    } 

... ... 소스에서 요소가 변경되지 산출하는 방법을 개인적으로

을 주목하라, 내가 좋겠 이 문제에 대해 더 많은 것을 피하고 두 번째 구현을 직접 수행하십시오.

allItems.GroupBy(i => new{i.PropertyOne, i.PropertyTwo}).Select(g => g.First()) 
+0

응답 해 주셔서 감사합니다. . 나는 그룹핑 제안과 함께 갔다 - 나는 그룹화 작업 후에도 세 번째 속성이 여전히 포함될 것임을 몰랐다. – Frekster

관련 문제