2

次のようなカテゴリ ID を持つ製品のリストがあります。

ID      CategoryID     Product Name
1       1              Product 1
2       1              Product 2
3       7              Product 3
4       8              Product 4
5       9              Product 5
6       10             Product 6

このリストを取得し、categoryID のリスト (1、8、9 など) で並べ替えると、次のようになります。

ID     CategoryID     Product Name
1      1              Product 1
2      1              Product 2
4      8              Product 4
5      9              Product 5
3      7              Product 3
6      10             Product 6

linqでこれを行う方法はありますか? ありがとう

4

5 に答える 5

5

1,8,9がリストにあると仮定して、を呼び出します。リストorderList内の位置を毎回検索し続けることができますが、辞書を作成してすばやく検索することができます。

var orderDict = orderList.Select((o, index) => new {ID = o, Order=index}).ToDictionary(oi => oi.ID, oi => oi.Order);
int orderHolder;
var orderedProducts = products.OrderBy(p => orderDict.TryGetValue(p.CategoryID, out orderHolder) ? orderHolder : int.MaxValue);

最初に厳密に設定する必要はありませんorderDictが、毎回リストをスキャンするよりもロジックが単純になり、O(nm)ではなくO(n + m)の方が速くなります。

于 2012-08-11T20:25:33.280 に答える
5

カテゴリ ID がリストにある場合は、次のように並べ替えることができます。

var list = new List<int>() { 1, 8, 9, 7, 10, ... };

var productsOrdered = from p in products
    let index = list.IndexOf(p.CategoryID)
    order by (index < 0 ? int.MaxValue : index) // in case it is not in the list
    select p;

このクエリは Linq to Objects でのみ機能するため、データベースからすべてのデータを順序付けされていないものにする必要があります。

于 2012-08-11T20:17:20.213 に答える
0

リストの一番上に並べ替えたいものがすべてわかっている場合は、次のことを試してください。

var products = new List<Product>();

products.Add(new Product { ID = 1, CategoryID = 1, ProductName = "1" });
products.Add(new Product { ID = 2, CategoryID = 1, ProductName = "2" });
products.Add(new Product { ID = 3, CategoryID = 7, ProductName = "3" });
products.Add(new Product { ID = 4, CategoryID = 8, ProductName = "4" });
products.Add(new Product { ID = 5, CategoryID = 9, ProductName = "5" });
products.Add(new Product { ID = 6, CategoryID = 10, ProductName = "6" });

products
    .OrderByDescending(p => p.CategoryID == 1 || p.CategoryID == 8 || p.CategoryID == 9)
    .ThenBy(p => p.CategoryID);

これを生成します (LinqPad から):

ID CategoryID ProductName 
1  1          1 
2  1          2 
4  8          4 
5  9          5 
3  7          3 
6  10         6 
于 2012-08-11T20:27:27.223 に答える
0
var query = from p in productsList
            orderby p.CategoryID descending
            select new {ID = p.ID, CID = p.CategoryID, PName = p.ProductName};

query製品リストの順序付けされたシーケンスが含まれるようになりました。次のように列挙できます。

foreach(Product prod in query)
   Console.WriteLine(prod.CID);

編集:答えを誤解しました。答えを更新します。

于 2012-08-11T20:14:04.570 に答える
0

使用できますEnumerable.OrderBy

var catIDs = new[] { 1, 8, 9 };
var ordered = products
    .OrderByDescending(p => catIDs.Contains(p.CategoryID))
    .ThenBy(p => p.CategoryID);

編集: ここにデモがあります: http://ideone.com/O462C

于 2012-08-11T20:10:23.623 に答える