基本上我有一个包含所有项目的列表。然后我有一个包含我想要从列表中获取的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数组对新列表进行排序?
答案 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]));
}
哪一个循环而没有排序等。