itsource

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

mycopycode 2023. 7. 1. 08:34
반응형

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

번호 목록이 있는 경우:

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

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

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

linq와 c#를 찾고 있습니다.감사해요.

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

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

사용합니다OrderByDescending왜냐하면 나는 일치하는 결과를 먼저 원하기 때문입니다.true보다 "안정적"입니다.false).

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

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

@Duane처럼폭동은 IEnumberable의 확장 메서드 OrderBy가 안정적으로 정렬되며 동일한 키를 가진 요소의 순서를 변경하지 않는다고 지적합니다.즉,

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

3을 먼저 정렬하고 다른 모든 요소의 순서를 유지하는 것도 마찬가지입니다.

아마도 이런 것들이 있을 것입니다.

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));
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);

동적 문자열 값 목록을 사용하여 아래 코드로 시도할 수 있습니다.

var defaultSortingInternalTrades = ["E,F,G"];
    
var ItemsToSort = ["A","B","C","D","E",...];
var fData = items.Where(d => defaultSortingInternalTrades.Contains(d.ToString()))
                 .OrderBy(x => defaultSortingInternalTrades.IndexOf(x.ToString())).ToList();
var oData = items.Where(d => !defaultSortingInternalTrades.Contains(d.ToString())).ToList();
fData.AddRange(oData);

@joachim-isaksson 아이디어를 사용하여 다음과 같은 확장 방법을 고안했습니다.

public static IOrderedEnumerable<TSource> OrderByWithGivenValueFirst<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector,
    TKey value
    ) 
    => source.OrderBy(x => !keySelector(x).Equals(value));

테스트:

[TestFixture]
public class when_ordering_by_with_given_value_first
{
    [Test]
    public void given_value_is_first_in_the_collection()
    {
        var languages = new TestRecord[] {new("cs-CZ"), new("en-US"), new("de-DE"), new("sk-SK")};

        languages.OrderByWithGivenValueFirst(x => x.Language, "en-US")
            .ShouldBe(new TestRecord[] {new("en-US"), new("cs-CZ"), new("de-DE"), new("sk-SK")});

    }

    private record TestRecord(string Language);
}

언급URL : https://stackoverflow.com/questions/9933888/linq-order-by-a-specific-number-first-then-show-all-rest-in-order

반응형