【发布时间】:2012-03-29 21:34:28
【问题描述】:
如果我有一个数字列表:
1,2,3,4,5,6,7,8
我想按特定编号订购,然后显示其余部分。 例如,如果我选择“3”,则列表应为:
3,1,2,4,5,6,7,8
寻找 linq 和 c#。 谢谢
【问题讨论】:
如果我有一个数字列表:
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“更高”)。
【讨论】:
OrderByDescending 更改为OrderBy 或i == 3 更改为i != 3
myDataList.OrderByDescending(i => i.StringColumnValue[0] == filterStringValue[0]).ToList()进行排序。我在这里用了你的逻辑。根据过滤器起始字母,这些结果以相同起始字母的顺序显示
m.id== 298 返回一个bool,它可以是true 或false,OrderByDescending 将首先产生true 值。也许你认为它不起作用的原因是别的。创建一个问题,以便其他人可以提供帮助。
可能是这样的:
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));
【讨论】:
一些答案已经对最后几个数字进行了排序(这可能是正确的,因为您只显示了一个已经排序的列表)。如果您希望“未选择”的数字以它们的原始、不一定排序的顺序而不是排序显示,你可以这样做;
int num = 3;
var result = list.Where(x => x == num).Concat(list.Where(x => x != num));
正如@DuaneTheriot 所指出的,IEnumerable's extension method OrderBy 进行了稳定的排序,不会改变具有相同键的元素的顺序。换句话说;
var result = list.OrderBy(x => x != 3);
同样可以先排序 3 并保持所有其他元素的顺序。
【讨论】:
list.OrderBy(i => i != 3)完成同样的事情。
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);
【讨论】: