Linq 먼저 특정 번호로 주문한 다음 모든 나머지를 순서대로 표시합니다.


78

번호 목록이있는 경우 :

1,2,3,4,5,6,7,8

특정 번호로 주문한 다음 나머지를 보여 드리고 싶습니다. 예를 들어 '3'을 선택하면 목록은 다음과 같아야합니다.

3,1,2,4,5,6,7,8

linq 및 c #을 찾고 있습니다. 감사합니다

답변:


181

OrderBy또는 ThenBy에서 비교 를 사용하여 조건부 정렬을 수행 할 수 있습니다 .

list.OrderByDescending(i => i == 3).ThenBy(i => i);

OrderByDescending일치하는 결과를 먼저 원 하기 때문에 사용합니다 ( true보다 "높음" false).


4
@cracker : 변화 OrderByDescendingOrderByi == 3i != 3
팀 Schmelter

문자열 열을 정렬하려는 경우 myDataList.OrderByDescending(i => i.StringColumnValue[0] == filterStringValue[0]).ToList() . 여기에 당신의 논리를 사용했습니다. 필터 시작하는 편지를 바탕으로, 그 결과는 같은 시작 문자 순서대로 표시됩니다
Pranesh Janarthanan

5

아마도 다음과 같습니다.

List<int> ls=new List<int>{1,2,3,4,5,6,7,8};
int nbr=3;
var result= ls.OrderBy (l =>(l==nbr?int.MinValue:l));

necro 댓글에 대해 죄송하지만 좋은 생각이 아닙니다. 목록에 int.MinValue 항목이 포함되어 있으면이 방법이 작동하지 않기 때문입니다.
Kevin

5

몇 개의 답변은 이미 마지막 몇 개의 숫자를 정렬합니다 (이미 정렬 된 목록 만 표시하므로 정확할 수 있음). "선택되지 않은"번호가 원래대로 표시되도록 하려면 정렬 된 순서가 아니라 반드시 정렬 된 순서 로 표시 하지 않아도 됩니다.

int num = 3;
var result = list.Where(x => x == num).Concat(list.Where(x => x != num));

@DuaneTheriot가 지적했듯이 IEnumerable의 확장 메서드 OrderBy 는 안정적인 정렬을 수행하며 동일한 키를 가진 요소의 순서를 변경하지 않습니다. 다시 말해;

var result = list.OrderBy(x => x != 3);

3을 먼저 정렬하고 다른 모든 요소의 순서를 유지하는 것과 마찬가지로 작동합니다.


1
을 사용하여 동일한 작업을 수행 할 수 있습니다 list.OrderBy(i => i != 3).
Duane Theriot 2012 년

2
public static IEnumerable<T> TakeAndOrder<T>(this IEnumerable<T> items, Func<T, bool> f)
{       
    foreach ( var item in items.Where(f))
        yield return item;
    foreach (var item in items.Where(i=>!f(i)).OrderBy(i=>i))
        yield return item;
}


var items = new [] {1, 4, 2, 5, 3};
items.TakeAndOrder(i=> i == 4);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.