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


78

如果我有一个数字列表:

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

我想按特定的编号订购,然后显示其余的。例如,如果我选择“ 3”,则列表应为:

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

寻找linq和C#。谢谢

Answers:


179

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

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)
杜安·塞里奥特

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.