我有一个包含属性 ID 的对象,其值介于101和199之间。如何订购199,101,102 ... 198
?
结果我想把最后一项放到第一位。
答案 0 :(得分:7)
所需的顺序没有意义(某些推理会有所帮助),但这应该可以解决问题:
int maxID = items.Max(x => x.ID); // If you want the Last item instead of the one
// with the greatest ID, you can use
// items.Last().ID instead.
var strangelyOrderedItems = items
.OrderBy(x => x.ID == maxID ? 0 : 1)
.ThenBy(x => x.ID);
答案 1 :(得分:1)
取决于您是对列表中的最大项目,还是列表中的最后一项感兴趣:
internal sealed class Object : IComparable<Object>
{
private readonly int mID;
public int ID { get { return mID; } }
public Object(int pID) { mID = pID; }
public static implicit operator int(Object pObject) { return pObject.mID; }
public static implicit operator Object(int pInt) { return new Object(pInt); }
public int CompareTo(Object pOther) { return mID - pOther.mID; }
public override string ToString() { return string.Format("{0}", mID); }
}
List<Object> myList = new List<Object> { 1, 2, 6, 5, 4, 3 };
// the last item first
List<Object> last = new List<Object> { myList.Last() };
List<Object> lastFirst =
last.Concat(myList.Except(last).OrderBy(x => x)).ToList();
lastFirst.ForEach(Console.Write);
Console.WriteLine();
// outputs: 312456
// or
// the largest item first
List<Object> max = new List<Object> { myList.Max() };
List<Object> maxFirst =
max.Concat(myList.Except(max).OrderBy(x => x)).ToList();
maxFirst.ForEach(Console.Write);
Console.WriteLine();
// outputs: 612345
答案 2 :(得分:0)
编辑:错过了关于你想要最后一项的部分。你可以这样做:
var objectList = new List<DataObject>();
var lastob = objectList.Last();
objectList.Remove(lastob);
var newList = new List<DataObject>();
newList.Add(lastob);
newList.AddRange(objectList.OrderBy(o => o.Id).ToList());
如果您正在谈论正常排序,您可以通过以下方法使用linq的顺序:
objectList = objectList.OrderBy(ob => ob.ID).ToList();
答案 3 :(得分:0)
结果我想把最后一项放在第一位
首先对列表进行排序
List<int> values = new List<int>{100, 56, 89..};
var result = values.OrderBy(x=>x);
添加用于交换List<T>
static void Swap<T>(this List<T> list, int index1, int index2)
{
T temp = list[index1];
list[index1] = list[index2];
list[index2] = temp;
}
使用后
result .Swap(0, result.Count -1);
答案 4 :(得分:0)
您可以使用单个Linq语句来实现此目的。
var ordering = testData
.OrderByDescending(t => t.Id)
.Take(1)
.Union(testData.OrderBy(t => t.Id).Take(testData.Count() - 1));
以相反的方向命令并取得前1名,然后按“正确的方式”命令它,并取出除了最后一个并将它们合并在一起。这种方法有很多变种,但上述方法应该有效。
此方法也适用于任意列表,无需知道最大数量。
答案 5 :(得分:0)
怎么样
var orderedItems = items.OrderBy(x => x.Id)
var orderedItemsLastFirst =
orderedItems.Reverse().Take(1).Concat(orderedItems.Skip(1));
这将多次迭代列表,因此可能更有效但不会使用太多代码。
如果更快的速度是重要的,你可以编写一个专门的IEnumerable扩展,允许你排序和返回而不转换为中间的IEnumerable。
答案 6 :(得分:-3)
var myList = new List<MyObject>();
//initialize the list
var ordered = myList.OrderBy(c => c.Id); //or use OrderByDescending if you want reverse order