如何按照另一个List的顺序订购List?

时间:2010-04-29 09:09:31

标签: 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
        {
            MyValue = myType.MyValue
        }).ToList();
}

所以如果ids包含

302
300个
301

返回的List按升序包含项目。

List<MyType>的顺序返回ids需要做什么?

由于

修改:我已尝试orderby ids.IndexOf(myType.Id),但会抛出异常Method 'Int32 IndexOf(Int32)' has no supported translation to SQL.

3 个答案:

答案 0 :(得分:7)

编辑:既然已经指出了我在理解要求方面所犯的错误,我认为这是实现预期结果的更高效的方法:

    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();
    }

这不会搜索db.MyTypes中每个元素的id列表(这是一件好事:它会很快!)。

我的原始(不正确)答案:

使用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(); 
} 

目前还不清楚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(); 
} 

答案 1 :(得分:5)

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();  
}  

注意我不知道这是否适用于SQL查询,因此这可能只是Linq-to-objects。使用大量的ID列表也可能效率很低。

答案 2 :(得分:4)

以下工作:

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;

}