주문 된 엔티티 목록이 있습니다. 각 엔티티에는 int UniqueKey
속성이 있습니다.LINQ의 고유 한 변형 목록을 나열하십시오.
목록을 변형하여 UniqueKey
값을 고유하게 만듭니다 (중복이 있다고 가정). 이것은 중복을 찾아 점진적으로 증가시킴으로써 이루어진다.
단계별 프로세스 : 인덱스 1 에서이
- 시작 이전의 요소가 같은
UniqueId
값이있는 경우 - , 값을 증가 (I는 제로 기반 색인을 사용하고 있습니다) 현재 색인에서.
- 반복 (2) 더 이전의 요소가 같은 UNIQUEID에게
- 이동이 없을 때까지
{ 1, 1, 1, 3, 3, 8 }
다음 단계를 통과 할 권리 예를 들어
, 하나 개의 요소 :
{ 1, 2, 1, 3, 3, 8 }
: 색인 1 증분{ 1, 2, 2, 3, 3, 8 }
: 색인 2가 증가됨{ 1, 2, 3, 3, 3, 8 }
: Ind 지수 3{ 1, 2, 3, 4, 4, 8 }
증분 : 예 2 또{ 1, 2, 3, 4, 3, 8 }
증분 인덱스 4{ 1, 2, 3, 4, 5, 8 }
증분 : 인덱스 4를 다시 증가
아래의 코드는 매우 절차 적 방법으로 전술 한 알고리즘을 수행
entities = entities.OrderBy(x => x.UniqueId);
foreach (var entity in entities)
{
var leftList = entities.Take(entities.IndexOf(entity));
while (leftList.Any(x => x.UniqueId == entity.UniqueId))
{
entity.UniqueId++;
}
}
질문 : LINQ에서이를 구현할 수 있습니까? ?
왜 이것을 LINQ에 구현하고 싶습니까?귀하의 알고리즘은 현재의 모양이 분명하다고 생각합니다. 확실히 속도를 높여 (가독성을 떨어 뜨릴 수는 있지만) LINQ를 사용하면이 알고리즘의 속도가 느려지고 판독이 어려워집니다. LINQ가 황금 망치가되어서는 안됩니다 ... –
이 정확한 알고리즘을 사용해야합니까, 아니면 모든 ID가 고유하게 만들어지는 알고리즘을 사용할 수 있습니까? LINQ를 사용하려면 각 항목에 고유 한 ID를 부여하는 것이 좋습니다. – Servy
쿼리가 아닌 의미 체계가있는 작업에 LINQ를 사용합니다 (http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx). 명령형 코드 만 사용하면 더 명확하고 간단 해집니다. – Vlad