C# 排序列表<;T>;带数组

C# 排序列表<;T>;带数组,c#,arrays,linq,list,sorting,C#,Arrays,Linq,List,Sorting,基本上我有一个包含所有项目的列表。然后我有一个字符串,其中包含我想从列表中获取的ID,为此,我将该字符串拆分为一个Int数组,然后使用this和LINQ从列表中获取我想要的项 像这样: List<T> lstAllList = Model.getAllItems(); string stringIDs = "8,9,12,11,7"; int[] intArray = stringIDs.Split(',').Select(n => Convert.ToInt32(n)).

基本上我有一个包含所有项目的列表。然后我有一个字符串,其中包含我想从列表中获取的ID,为此,我将该字符串拆分为一个Int数组,然后使用this和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();
List lstallist=Model.getAllItems();
字符串stringIDs=“8,9,12,11,7”;
int[]intArray=stringIDs.Split(',')。选择(n=>Convert.ToInt32(n)).ToArray();
List lstLimitedList=(从lntarray.Contains(r.id)所在的lstallist中的r中选择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();
stringIDs=“8,9,12,11,7”;
int[]intArray=stringIDs.Split(',')。选择(n=>Convert.ToInt32(n)).ToArray();
var lstLimitedList=(
从lstallist中的r
其中intArray.Contains(r.id)

orderby Array.IndexOf(intArray,r.id)/停止过度使用LINQ guys。在这种情况下,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]));
}
string a=“8,9,12,11,7”;
列表=新列表();
string[]splitted=a.Split(',');
for(int i=0;i

这是一个单循环,没有排序等。

一次只获取一个元素可能比尝试使用更快。(有人愿意计算O()成本吗?)

List lstLimitedList=new List();
foreach(intArray中的int-id)
{
添加(lstallist.Where(item=>item.id=id));
}

如果您是LINQ狂人,也可以使用
intArray.ForEach()
,但这更易于阅读。

Id使用LINQ提供的intersect扩展方法

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 
}
int[]array={8,9,12,11,7}//或字符串拆分的结果;
List array2=新列表{8,9,12,11,7}//your model.GetAllItems;
//调用Intersect扩展方法。
var intersect=array.intersect(array2);
//将交叉点写入屏幕。
foreach(intersect中的int值)
{
Console.WriteLine(value);//输出:8,9,12,11,7
}

对我来说更干净一点

尝试旋转查询。在单词rotate下,我的意思是从intArray开始,然后使用join。大概是这样的:

List<T> lstLimitedList = (
from id in intArray 
join item in lstAllList on id equals item.Id 
select item).ToList();
List lstLimitedList=(
来自intArray中的id
在id等于item.id的lstAllList中联接项
选择项);

所以你甚至不打算为你的-1辩护,反对这个简单可行的解决方案?最终结果应该是
T
s的列表(不管是什么),而不是
int
s的列表。OP试图根据数组中值的顺序进行排序。您首先提供了获取阵列的另一种方法。你还没有回答这个问题。这比预期的容易。将在答案可用时接受答案。谢谢
List<T> lstLimitedList = (
from id in intArray 
join item in lstAllList on id equals item.Id 
select item).ToList();