這是一個一般的陣列問題,但就我而言,它是一個字串串列。
給定:[a, b, c, d, e, f, g, h] 和集合中的一個專案,比如 f。
輸出:[f, g, h, a, b, c, d, e]
我可以使用子字串方法或.take 和.skip 之類的東西。但是有沒有更清潔的替代品,比如使用 linq 或其他我可能不知道的東西?
編輯:好的,我很抱歉我沒有正確寫問題。當我說 LINQ 時,我的意思是涉及 lambda 運算式?感謝您的意見。我會堅持采取和跳過。
uj5u.com熱心網友回復:
Take()和Skip()方法是 LINQ 的一部分。我看不出如何在不使用這些方法的情況下通過 LINQ 重新排列串列中的專案。
List<string> list = new List<string>() { "a", "b", "c", "d", "e", "f", "g", "h", "i" };
string character = "f";
int i = list.IndexOf(character);
if (i != -1)
{
list = list.Skip(i).Concat(list.Take(i)).ToList();
}
您還可以使用List以下特定方法
List<string> list = new List<string>() { "a", "b", "c", "d", "e", "f", "g", "h", "i" };
string character = "f";
int i = list.IndexOf(character);
if (i != -1)
{
var sublist = list.GetRange(i, list.Count - i);
list.RemoveRange(i, list.Count - i);
list.InsertRange(0, sublist);
}
uj5u.com熱心網友回復:
如果您不介意創建一個新的List或陣列,您可以使用擴展方法 (for IEnumerable<T>) 來旋轉專案,然后創建您想要的集合。
// num - return items starting with numth item and wrapping around
// e.g. rotate items so that numth item is first
public static IEnumerable<T> Rotate<T>(this IEnumerable<T> items, int num) {
if (num > 0)
if (items is IList<T> itemList) {
for (int j1 = 0; j1 < itemList.Count; j1)
yield return itemList[(j1 num) % itemList.Count];
}
else
using (var itemsEnum = items.GetEnumerator()) {
var q = new Queue<T>();
while (itemsEnum.MoveNext() && num-- > 0)
q.Enqueue(itemsEnum.Current);
do {
yield return itemsEnum.Current;
} while (itemsEnum.MoveNext());
while (q.Count > 0)
yield return q.Dequeue();
}
}
使用此擴展方法,您可以
var ans = src.Rotate(src.IndexOf("f")).ToList(); // or .ToArray()
如果您想在不創建其他物件的情況下執行此操作,則可以改用此答案。
uj5u.com熱心網友回復:
另一種可能
var newlist = new List<string>(oldList.Count);
newList.Add("f");
newList.AddRange(oldList.Where(x=>x!="f"));
效率較低,因為即使在找到目標元素后它也會繼續查看元素,但代碼很簡單
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425627.html
上一篇:將命名串列轉換為單個字串r
下一篇:在尋找其他值時更改json中的值
