[英]Sort List<T> with an array
基本上我有一個包含所有項目的列表。 然后,我有一個包含要從列表中提取的ID的字符串,為此,我將字符串拆分為一個Int數組,然后使用此字符串和LINQ從列表中獲取我想要的項目
像這樣 :
List<T> lstAllList = Model.getAllItems();
string stringIDs = "8,9,12,11,7";
int[] intArray = stringIDs.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
List<T> lstLimitedList = (from r in lstAllList where intArray.Contains(r.id) select r).ToList();
哪個很棒。
但是這里的問題是,我希望以與ID字符串相同的方式對列表進行排序,即像本例中那樣是8,9,12,11,7。 但是LINQ返回的列表默認情況下按ID對其進行排序,因此返回的列表為7,8,9,11,12。
有沒有辦法防止它像這樣排序,還是有辦法用我的int數組對新列表進行排序?
當然,只需按ID在數組中的索引排序即可:
string stringIDs = "8,9,12,11,7";
int[] intArray = stringIDs.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
var lstLimitedList = (
from r in lstAllList
where intArray.Contains(r.id)
orderby Array.IndexOf(intArray, r.id) // <--------
select r).ToList();
一次只獲取一個元素可能比嘗試求助更快。 (有人願意計算O()費用嗎?)
List<T> lstLimitedList = new List<T>();
foreach(int id in intArray)
{
lstLimitedList.Add(lstAllList.Where(item => item.id = id));
}
如果您是LINQ瘋子,也可以使用intArray.ForEach()
,但這更容易閱讀。 ;)
嘗試旋轉您的查詢。 在單詞rotate下,我的意思是從intArray開始並使用join。 像這樣:
List<T> lstLimitedList = (
from id in intArray
join item in lstAllList on id equals item.Id
select item).ToList();
請使用LINQ提供的相交擴展方法!
int[] array ={ 8,9,12,11,7} // or your result from your split on string;
List<int> array2 = new List<int> { 8,9,12,11,7 } // your model.GetAllItems;
// Call Intersect extension method.
var intersect = array.Intersect(array2);
// Write intersection to screen.
foreach (int value in intersect)
{
Console.WriteLine(value); // Output: 8,9,12,11,7
}
給我一點清潔
停止過度使用LINQ家伙。 在這種情況下,linq絕對是多余的。 下面是一個更簡單,性能更好的解決方案:
string a = "8,9,12,11,7";
List<int> list = new List<int>();
string[] splitted = a.Split(',');
for (int i = 0; i < splitted.Length; i++)
{
list.Add(int.Parse(splitted[i]));
}
其中單個循環且無排序等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.