簡體   English   中英

使用字符串數組c#在linq中'orderby'

[英]'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM