LINQ를 사용하여 순서 유지
정렬된 배열에서 LINQ to Objects 명령을 사용합니다.배열 순서가 변경되지 않도록 하려면 어떤 작업을 수행해야 합니까?
저는 시스템의 방법을 검토했습니다.Linkq.Enumberable, IEnumberable이 아닌 결과를 반환한 모든 항목을 삭제합니다.결과의 순서가 출처의 순서와 어떻게 다를지 판단하기 위해 각각의 발언을 확인했습니다.
질서를 절대적으로 유지합니다.인덱스별로 소스 요소를 결과 요소에 매핑할 수 있습니다.
- 애즈 에너미블
- 출연자들
- 콩캣
- 선택한다.
- 대상 배열
- 받는 사람 목록
질서를 유지합니다.요소는 필터링 또는 추가되지만 다시 정렬되지는 않습니다.
- 분명한
- 제외하고
- 교차
- Of 타입
- Prepend(.net 4.7.1의 새로운 기능)
- 건너뛰다.
- 건너뛰는 동안
- 가지고 가다
- 시간을 빼앗기
- 어디에
- Zip(.net 4의 새로운 기능)
순서 파괴 - 어떤 순서로 결과를 예상해야 할지 알 수 없습니다.
- 사전으로
- 조회처
순서를 명시적으로 재정의합니다. 이를 사용하여 결과의 순서를 변경합니다.
- 주문 기준
- 내림차순 정렬
- 역
- 그 때까지
- 그 다음 내림차순서대로
일부 규칙에 따라 주문을 재정의합니다.
- GroupBy - 각 I 그룹의 첫 번째 키를 생성한 소스 요소의 순서에 따라 I 그룹 개체가 생성됩니다.그룹의 요소는 원본에 나타나는 순서대로 산출됩니다.
- GroupJoin - GroupJoin은 외부 요소의 순서를 유지하고 외부 요소의 각 요소에 대해 내부에서 일치하는 요소의 순서를 유지합니다.
- 결합 - 외부 요소의 순서와 이러한 각 요소에 대해 내부 요소의 일치 순서를 유지합니다.
- 다수 선택 - 소스의 각 요소에 대해 선택기가 호출되고 일련의 값이 반환됩니다.
- Union - 이 메서드에서 반환된 개체를 열거하면 Union은 해당 순서로 첫 번째와 두 번째를 열거하고 아직 산출되지 않은 각 요소를 산출합니다.
편집: 이 구현을 기반으로 Distinct를 질서 유지로 이동했습니다.
private static IEnumerable<TSource> DistinctIterator<TSource>
(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}
실제로 SQL 또는 어레이에 대해 말씀하시는 겁니까?즉, LINQ를 SQL에 사용하는 것입니까, LINQ를 Objects에 사용하는 것입니까?
LINQ to Objects 연산자는 실제로 원래 데이터 소스를 변경하지 않고 데이터 소스에 의해 효과적으로 지원되는 시퀀스를 구축합니다.순서를 변경하는 작업은 OrderBy/OrderByDescending/ThenBy/ThenByDescending뿐이며, 동일한 순서의 요소에 대해서도 안정적입니다.물론 많은 작업을 수행하면 일부 요소가 필터링되지만 반환되는 요소의 순서는 동일합니다.
예를 들어 ToLookup 또는 ToDictionary와 같은 다른 데이터 구조로 변환하는 경우, 해당 시점에서 순서가 보존된다고 생각하지 않지만, 어쨌든 그것은 다소 다릅니다. (그러나 동일한 키에 매핑되는 값의 순서는 룩업에 대해 보존된다고 생각합니다.
배열 작업을 하는 경우 SQL이 아닌 LINQ-to-Objects를 사용하는 것처럼 들립니다. 확인할 수 있습니까?대부분의 LINQ 작업은 아무 것도 재주문하지 않으므로(출력은 입력과 동일한 순서가 될 것입니다) 다른 정렬을 적용하지 마십시오(OrderBy[Descending])/그다음에 By[Descending].
[편집: Jon이 더 분명히 말했듯이, LINQ는 일반적으로 원래 데이터를 그대로 두고 새로운 시퀀스를 만듭니다.]
를 이터를에밀것유에의오시십에 밀어넣습니다.Dictionary<,>
(ToDictionary)는 사전이 특정 정렬 순서를 존중하지 않기 때문에 데이터를 스크램블합니다.
그러나 대부분의 일반적인 항목(선택, 위치, 건너뛰기, 찍기)은 문제가 없습니다.
저는 공식 문서를 참조하는 비슷한 질문에서 훌륭한 답변을 찾았습니다.인용하자면:
위해서Enumerable
to LINQ to Objects, 에 List<T>
), )에 의해 할 수 Select
,Where
또는GroupBy
이것은 본질적으로 질서가 없는 것들의 경우가 아닙니다.ToDictionary
또는Distinct
.
Enumerable에서.문서별 그룹화:
그
IGrouping<TKey, TElement>
객체는 각 요소의 첫 번째 키를 생성한 소스의 요소 순서에 따라 순서대로 산출됩니다.IGrouping<TKey, TElement>
그룹의 요소는 표시된 순서대로 산출됩니다.source
.
이는 에 대해 반드시 맞는 것은 아닙니다.IQueryable
확장 메서드(다른 LINQ 공급자).
출처: LINQ의 열거 가능한 방법은 요소의 상대적 순서를 유지합니까?
'그룹화 기준' 또는 '주문 기준'은 순서를 변경할 수 있습니다.
여기서의 질문은 특히 LINQ-to-Objects에 대한 것입니다.
대신 LINQ-to-SQL을 사용하는 경우 다음과 같은 순서를 적용하지 않는 한 순서가 없습니다.
mysqlresult.OrderBy(e=>e.SomeColumn)
LINQ-to-SQL에서 이 작업을 수행하지 않으면 동일한 데이터라도 후속 쿼리에 따라 결과 순서가 달라져 간헐적인 버그가 발생할 수 있습니다.
저에게 문제는 아래와 같이 2열씩 기본 정렬 순서를 결정하는 것이었습니다.여러 번 반복한 끝에 기본 정렬 순서를 찾아서 LINQ 쿼리에서 다시 실행할 수 있었습니다.중복을 제거하려면 중복이 없는 새 문자열 목록을 만드는 데 각에 대한 단순을 사용합니다.
//original sorting order lost
var inv2 = db.Inventories
.GroupBy(l => l.VendorFullSKU)
.Select(cl => new Inventory2
{
VariantID = cl.FirstOrDefault() == null ? 0 : cl.FirstOrDefault().VariantID,
Quan = cl.Sum(c => c.Quan),
Color = cl.FirstOrDefault() == null ? "" : cl.FirstOrDefault().Color
});
//original sorting order restored
var bl = (from pv in db.ProductVariants
join inv in inv2 on pv.VariantID equals inv.VariantID
orderby inv.VariantID, inv.Color //sort
select inv.Color
).ToList();
//remove duplicates while preserving original sort order
var colorsDistinct = new List<string>();
foreach (var item in bl)
{
if (!colorsDistinct.Contains(item))
colorsDistinct.Add(item);
}
언급URL : https://stackoverflow.com/questions/204505/preserving-order-with-linq
'code' 카테고리의 다른 글
열거형을 열거하는 방법? (0) | 2023.05.18 |
---|---|
AD 토큰을 포함한 가져오기 요청에 대한 AzureBob 스토리지 "인증 권한 불일치" 오류 (0) | 2023.05.18 |
명령 프롬프트 / Windows Powershell(Windows 10)에서 UTF-8 인코딩(CHCP 65001) 사용 (0) | 2023.05.18 |
postgresql 포트 혼란 5433 또는 5432? (0) | 2023.05.18 |
이 빌드 중 "코드 9009로 종료"는 무엇을 의미합니까? (0) | 2023.05.18 |