簡體   English   中英

排序清單 <T> 與數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM