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#。感谢
您可以在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));
正如@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);
}