Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按另一个列表的顺序排列列表?_C#_Linq_List - Fatal编程技术网

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
包含

302
300
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个元素。如果它是任何更多的,我会以不同的方式来处理这个问题。谢谢