你不能一步完成,你至少需要兩次迭代陣列。但是,你能做到這一點(有點哈克)做法:
var range = Enumerable.Range(0, list.Count);
var index = range.Aggregate((p,c) => list[p].X> list[c].X? c : p);
var rotated = range.Select(i => list[(i + index) % list.Count]).ToList();
下面是一個example(使用Tuple
而不是Point
,但它的原理相同)
的第一步是要找到最低值的index
在你的數組中。第二步,他們從那個索引開始構建新的數組並循環。
如果你想將其封裝在一個擴展方法,你可以做這樣的事情:
public static IEnumerable<T> Rotate<T>(this List<T> list, Func<T,T, bool> comparer)
{
var range = Enumerable.Range(0, list.Count);
var index = range.Aggregate((p,c) => predicate(list[p],list[c]) ? p : c);
return range.Select(i => list[(i + index) % list.Count]);
}
,你會打電話來是這樣的:
var output = input.Rotate((x, y) => x.X < y.X));
你傳遞一個函數,如果它的計算結果爲真,將選擇x
而不是y
爲什麼不只是'input.OrderBy(p => pX)'? –
請使用循環顯示您的當前代碼,並嘗試使用LINQ方法。 LINQ對你有什麼好處,你在潛在答案中尋找什麼? – CodeCaster
OrderBy不起作用。 OP想要旋轉列表,以便X值最小的點是第一個,但保留列表的順序。 – swatsonpicken