C# 如何按另一个列表的顺序排列列表?
我有一个方法如下。它返回一个C# 如何按另一个列表的顺序排列列表?,c#,linq,list,C#,Linq,List,我有一个方法如下。它返回一个MyTypes列表,默认情况下,这些类型按myType.Id升序排列。我希望此列表按传入方法的ids参数排序 public List<MyType> GetMyTypes(List<int> ids) { return (from myType in db.MyTypes where ids.Contains(myType.Id) select new MyType { M
MyTypes
列表,默认情况下,这些类型按myType.Id
升序排列。我希望此列表按传入方法的ids
参数排序
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
select new MyType
{
MyValue = myType.MyValue
}).ToList();
}
公共列表GetMyTypes(列表ID)
{
返回(从db.MyTypes中的myType返回)
其中ids.Contains(myType.Id)
选择新的MyType
{
MyValue=myType.MyValue
}).ToList();
}
所以如果ids
包含
302300
301 返回的列表包含按升序排列的项 我需要做什么才能按
id
的顺序返回List
谢谢
edit:我尝试了
orderby-Id.IndexOf(myType.Id)
但它抛出了异常方法“Int32-IndexOf(Int32)”不支持转换为SQL。
edit:现在我在理解需求时犯的错误已经被指出了,我建议这是实现预期结果的更有效的方法:
public static List<MyType> GetMyTypes(List<int> ids)
{
int index = 0;
Dictionary<int, int> positions = ids.ToDictionary(c => c, c => index++);
MyType[] results = new MyType[ids.Count];
foreach (MyType aType in (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select myType))
{
results[positions[aType.Id]] = aType;
}
return results.ToList();
}
公共静态列表GetMyTypes(列表ID)
{
int指数=0;
Dictionary positions=ids.ToDictionary(c=>c,c=>index++);
MyType[]结果=新的MyType[ids.Count];
foreach(MyType)aType in(来自db.MyTypes中的MyType
其中ids.Contains(myType.Id)
orderby myType.Id
选择myType)
{
结果[位置[aType.Id]]=aType;
}
返回结果。ToList();
}
这不会在id列表中搜索db.MyTypes中的每个元素(这是一件好事:它会很快!)
我原来(不正确)的回答:
使用orderby子句
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select new MyType
{
MyValue = myType.MyValue
}).ToList();
}
公共列表GetMyTypes(列表ID)
{
返回(从db.MyTypes中的myType返回)
其中ids.Contains(myType.Id)
orderby myType.Id
选择新的MyType
{
MyValue=myType.MyValue
}).ToList();
}
目前还不清楚db.MyTypes返回什么类型的对象,但是,可以猜测,通过避免更新更多MyType对象,代码可以简化一点
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select myType).ToList();
}
公共列表GetMyTypes(列表ID)
{
返回(从db.MyTypes中的myType返回)
其中ids.Contains(myType.Id)
orderby myType.Id
选择myType).ToList();
}
Daniel几乎是对的,但是使用传入列表的顺序的一种简单方法是根据该列表中ID的索引进行排序:
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby ids.IndexOf(myType.Id)
select myType).ToList();
}
公共列表GetMyTypes(列表ID)
{
返回(从db.MyTypes中的myType返回)
其中ids.Contains(myType.Id)
orderby Id.IndexOf(myType.Id)
选择myType).ToList();
}
注意,我不知道这是否适用于SQL查询,因此这可能只是Linq到对象。使用大量ID列表也可能非常低效。以下方法有效:
public List<MyType> GetMyTypes(List<int> ids)
{
var unordered = (from myType in db.MyTypes
where ids.Contains(myType.Id)
select new MyType
{
MyValue = myType.MyValue
}).ToList();
var ordered = (from uo in unordered
orderby ids.IndexOf(uo.Id)
select uo).ToList();
return ordered;
}
公共列表GetMyTypes(列表ID)
{
var unordered=(来自db.MyTypes中的myType
其中ids.Contains(myType.Id)
选择新的MyType
{
MyValue=myType.MyValue
}).ToList();
var ordered=(从无序中的uo开始)
orderby Id.IndexOf(uo.Id)
选择uo.ToList();
订购退货;
}
我认为这不是OP想要的。我阅读问题的方式是,他希望列表按照Id在ids
@Daniel&@Jens中的排序方式排序,是的,我试图按照我作为方法参数提供的原始Id列表排序。感谢+1的快速性:-)虽然这不是我的代码,所以我不想对它做太多更改,所以我将使用我在下面发布的答案。谢谢你的意见!谢谢尼古拉斯。我已经用错误修正编辑了答案。这次也进行了一些(有限的)测试!您好,Simon,正如您所指出的,它似乎不适用于LINQtoSQL。它引发以下异常:方法“Int32 IndexOf(Int32)”不支持到SQL的转换。
我认为有一种方法可以避免Linq到SQL的问题,而且性能更高,请参阅我编辑的答案这避免了Linq到SQL的问题,但是根据ID的大小和结果集,仍然可能非常慢。你说得对,Simon。不过,我在这里允许自己有点胡说八道,因为我知道ID列表的长度总是~4个元素。如果它是任何更多的,我会以不同的方式来处理这个问题。谢谢