Linq에서 .distinct를 사용하여 테이블의 한 필드를 기반으로 결과를 얻으려고합니다 (따라서 테이블에서 전체 복제 된 레코드가 필요하지 않음).
다음과 같이 distinct를 사용하여 기본 쿼리를 작성하는 것을 알고 있습니다.
var query = (from r in table1
orderby r.Text
select r).distinct();
하지만 r.text
중복되지 않은 결과가 필요합니다 .
답변
이 시도:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
테이블을 그룹화하고 Text
각 그룹의 첫 번째 행을 사용하여 Text
고유 한 행을 만듭니다.
답변
MoreLinq에는 다음을 사용할 수 있는 DistinctBy 메소드가 있습니다.
그것은 당신이 할 수 있습니다 :
var results = table1.DistictBy(row => row.Text);
이 메소드의 구현 (인수 검증 부족)은 다음과 같습니다.
private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
답변
하지만 r.text가 복제되지 않은 결과가 필요합니다.
원하는 것처럼 들립니다.
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
이 Text
고유 한 행을 선택합니다 .
답변
위의 Daniel Hilgarth 의 답변은 Entity-Framework 의 System.NotSupported
예외로 이어집니다 . Entity-Framework를 사용하면 다음과 같아야 합니다.
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
답변
이 주제와 관련하여 많은 토론이 있습니다.
당신은 그들 중 하나를 찾을 수 있습니다 여기에 :
가장 인기있는 제안 중 하나는 @Servy가 지적한 것처럼 람다 식을 매개 변수로 사용하는 Distinct 메서드입니다.
C #의 수석 설계자 인 Anders Hejlsberg는 여기 에서 해결책을 제안했습니다 . 또한 프레임 워크 디자인 팀이 람다가 필요한 Distinct 메서드의 오버로드를 추가하지 않기로 결정한 이유를 설명합니다.
답변
내가 찾은 것 중에서 귀하의 쿼리는 대부분 정확합니다. “select r”을 “select r.Text”로 변경하면 문제가 해결됩니다. 이것이 MSDN의 작동 방식을 문서화 한 방법입니다.
전의:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
답변
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });