C# 排序列表<;T>;带数组
基本上我有一个包含所有项目的列表。然后我有一个字符串,其中包含我想从列表中获取的ID,为此,我将该字符串拆分为一个Int数组,然后使用this和LINQ从列表中获取我想要的项 像这样: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)).
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();