[英]'orderby' in linq using a string array c#
假设我有一个方法定义:
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的属性
我认为这解决了问题:
var orderedArray = YourCustomArray.OrderBy(s => s).ToArray();
如果实现了查询,则应该能够在数组中找到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();
如果customerIds总是数字,那么在将它用于你的查询之前将其转换并订购
var orderedIds = CustomerIDs.Cast<int>().OrderBy(x => x);
你可以使用IndexOf:
orerby ContactIds.IndexOf(a.CustomerId)
请注意,对于大型集合,这可能不那么有效。
您可以使用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]
...
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.