Linq先按特定数字排序,然后按顺序显示所有其余部分

本文关键字:显示 余部 顺序 数字 Linq 排序 然后 | 更新日期: 2023-09-27 18:29:38

如果我有一个数字列表:

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

我想按特定的号码订购,然后展示其余的。例如,如果我选择"3",列表应该是:

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

正在查找linq和c#。感谢

Linq先按特定数字排序,然后按顺序显示所有其余部分

您可以在OrderByThenBy中使用比较来执行条件排序。

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

我使用OrderByDescending是因为我首先想要匹配结果(truefalse"高")。

几个答案已经对最后几个数字进行了排序(这可能是正确的,因为您只显示了一个已经排序的列表)。如果您希望"未选择"的数字显示在其原始数字中,而不一定是按排序的,您可以这样做;

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进行排序并保持所有其他元素的顺序同样有效。

也许是这样的:

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