2013-02-15 4 views
1

제가 앞뒤가 맞지 않아요. 내 예제를 잘못 말한 것 같습니다. 답변을 주신 분들께 진심으로 감사드립니다. 제발 좀 더 정확한 내용으로 설명하려고 다시 시도하겠습니다. 답변을 수정하십시오. 다시 한 번 이전 게시물에 더 정확하지 않은 점에 대해 사과드립니다.일치하는 속성을 가진 개체 목록의 첫 번째 개체를 유지하십시오.

내 스테이징 테이블을 나타내는 Staging이라는 엔터티 프레임 워크 모델 클래스를 사용하면 다음과 같은 메시지가 표시됩니다. List<Staging>.

public partial class Staging 
{ 
    public int ID { get; set; }  //PK 
    public int RequestID { get; set; } //FK 
    ... 
    public string Project { get; set; } 
    ... 
} 

우리가 쿼리 내 data 목록에 10 개 개의 레코드를 반환한다고 가정하자

List<Staging> data = (from t in database.Stagings select t).ToList(); 
//check for an empty List...react accordingly... 

여기에 빠른 Staging의 모습을 봐입니다. data[3], data[6]data[7]은 각각 data.Project에 동일한 값을 가지고 있다고 가정 해 봅니다. "Foo"이라고 가정 해 봅시다. data.Project 값은 런타임까지 알 수 없습니다.

이 경우, 첫 번째 발생 인 data[3]을 어떻게 유지하고 data[6]data[7]을 내 List<Staging>에서 제거 할 수 있습니까?

편집 : 나는 다음과 같은 코드를 가지고 있지만 다른 방법이 있습니까?

HashSet<string> projectValuesFound = new HashSet<string>(); 
    List<Staging> newData = new List<Staging>(); 

    foreach (Staging entry in data) 
    { 
    if (!projectValuesFound.Contains(entry.Project)) 
    { 
     projectValuesFound.Add(entry.Project); 
     newData.Add(entry); 
    } 
    } 
+0

대답은 여기 http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property –

답변

0

당신은 Linq에 사용할 수 : 당신이 또한이 다른 항목을 유지하려면, 대신 첫 번째의() Distinct()을 사용할 수 있습니다

var result = (from my in theList where my.Var3 == "Foo" select my).First(); 

. Dictinct()를 사용하려면 MyClassIEquatable<T>을 구현해야하며, MSDN 링크에 표시된대로 IEqualityComparer<T>을 제공해야합니다.

+0

무슨 뜻인지 확실치 않습니다. Distinct()에는'IEqualityComparer '이 필요합니다. –

2

당신은 LINQ를 통해이 작업을 수행하고 HashSet<T> 수 있습니다 HashSet<T>.Add 반환 값이 이미 세트가 아닌 경우 참과 거짓이 이미 존재하는 경우 때문에

var found = new HashSet<string>(); 
var distinctValues = theList.Where(mc => found.Add(mc.Var3)); 

// If you want to assign back into the List<T> again: 
// theList = distinctValues.ToList(); 

이 작동합니다. 따라서 Var3의 첫 번째 '일치'값만 가져옵니다.

0
var uniques = (from theList select theList.Var3).Distinct(); 

이렇게하면 모든 항목에 고유 한 값이 부여됩니다.

+1

OP의 요구 사항을 충족시키기 위해 (InterClass가'IEquatable '을 구현하지 않는 한)이 항목을 위해 'IEqualityComparer '을'Distinct() '에 제공해야합니다. –

+0

@EricJ. 비교자를 사용하지 않고 별개의 'Var3'값을 반환합니다. 물론 문제는'MyClass' 객체가 아닌'Var3' 값을 반환한다는 것입니다. –

0

Distinct에 적절하게 구현 비교자를 통과하는 것입니다 수행하는 "표준"방법 :

class Var3Comparer : IEqualityComparer<MyClass> { 
    public int GetHashCode(MyClass obj) { 
     return (obj.Var3 ?? string.Empty).GetHashCode(); 
    } 
    public bool Equals(MyClass x, MyClass y) { 
     return x.Var3 == y.Var3; 
    } 
} 

// ... 

var distinct = list.Distinct(new Var3Comparer()); 

그냥 현재의 구현은 "생존"요소의 순서를 유지하는 것 동안, 설명서를 말한다 조심 그것은 "순서가없는 순서"를 반환하며 최선의 방법으로 처리됩니다.

도 비교자를 필요로하지 않는 Distinct overload있다 - 그것은 단지 MyClass에 의해 구현하면 차례로, IEquatable<T>를 활용합니다 Default 비교자를, 가정합니다.

관련 문제