使用字符串数组c#在linq中'orderby'

时间:2010-02-17 18:24:21

标签: c# linq

假设我有一个方法定义:

public CustomerOrderData[] GetCustomerOrderData(string[] CustomerIDs)
{
 var query = (from a in db.Customer
              join b in db.Order on a.CustomerID equals v.CustomerID
              orderby CustomerIDs
              select new CustomerOrderData()
              {
                //populate props here
              }).ToArray();
}

输入参数中的我的CustomerID可以是{“1”,“3”,“400”,“200”}

我想以上述方式订购我的返回数组。有没有一种简单的方法来实现这个目标?

我的解决方案是将其放入Dictionary中,然后在循环访问CustomerIDs集合时创建一个新数组。

CustomerOrderData有一个名为CustomerID的属性

6 个答案:

答案 0 :(得分:5)

如果实现了查询,则应该能够在数组中找到id的索引并将其用作排序参数。使用扩展方法在下面显示。

var ordering = CustomerIDs.ToList();
var query = db.Customer.Join( db.Order, (a,b) => a.CustomerID == b.CustomerID )
                       .AsEnumerable()
                       .OrderBy( j => ordering.IndexOf( j.Customer.CustomerID ) )
                       .Select( j => new CustomerOrderData {
                          // do selection
                        })
                       .ToArray();

答案 1 :(得分:5)

我认为这解决了问题:

var orderedArray = YourCustomArray.OrderBy(s => s).ToArray();

答案 2 :(得分:4)

如果customerIds始终是数字,则在将其用于您的查询

之前将其投射并订购
var orderedIds =  CustomerIDs.Cast<int>().OrderBy(x => x);

答案 3 :(得分:0)

您可以使用IndexOf:

orerby ContactIds.IndexOf(a.CustomerId)

请注意,对于大型集合,这可能效率不高。

答案 4 :(得分:0)

您可以使用customerid创建一个结构来查找所需的索引。

string[] CustomerIDs;

Dictionary<string, int> customerIDOrdering = CustomerIds
  .Select((c, i) => new (id = c.CustomerID, i = i})
  .ToDictionary(x => x.id, x => x.i);

var query = from c in ...
    orderby customerIDOrdering[c.CustomerID]  
    ...

答案 5 :(得分:0)

join子句保留外部序列的顺序:

“Join运算符保留外部序列元素的顺序,并为每个外部元素保留匹配的内部序列元素的顺序。”

http://msdn.microsoft.com/en-us/library/bb394939.aspx

所以你根本不需要订购:

from orderIndex in CustomerIDs
join a in db.Customer on orderIndex equals a.CustomerID
join b in db.Order on a.CustomerID equals v.CustomerID