使用数组</t>对List <t>进行排序

时间:2014-04-29 12:46:40

标签: c# arrays linq list sorting

基本上我有一个包含所有项目的列表。然后我有一个包含我想要从列表中获取的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数组对新列表进行排序?

5 个答案:

答案 0 :(得分:3)

当然,只需按数组中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();

答案 1 :(得分:1)

简单地一次获取元素可能比尝试求助更快。 (有人愿意计算O()成本吗?)

List<T> lstLimitedList = new List<T>();

foreach(int id in intArray)
{
    lstLimitedList.Add(lstAllList.Where(item => item.id = id));
}

如果您是LINQ疯子,也可以使用intArray.ForEach(),但这更容易阅读。 ;)

答案 2 :(得分:1)

尝试轮换您的查询。在单词旋转下我的意思是从intArray开始并使用join。像这样:

List<T> lstLimitedList = (
from id in intArray 
join item in lstAllList on id equals item.Id 
select item).ToList();

答案 3 :(得分:0)

Id使用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 
}

对我来说清洁剂

答案 4 :(得分:-2)

停止过度使用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]));
}

哪一个循环而没有排序等。