我有Book課:
public class Book
{
public int Id {get; set;}
public string Name {get; set;}
public deciaml Price {get; set;}
}
和清單books:
List<Book> books = new List<Book>
{
new Book
{
Id = 1,
Name = "AA",
Price = 19.0000M
},
new Book
{
Id = 2,
Name= "BB",
Price = 18.0000M
},
new Book
{
Id = 3,
Name = "CC",
Price = 30.0000M
},
new Book
{
Id = 4,
Name = "DD",
Price = 9.0000M,
},
};
現在我想按價格對串列進行分組,例如便宜、中等、昂貴:
例如,便宜 = 10,中等 = 20,昂貴 = 30 分組串列如下:
List<(decimal category, List<Book> books)
{
category: 10
books: List<Book>() {Book {4, "DD", 9.0000M}},
category: 20
books: List<Book>() {Book {1, "AA", 19.0000M}, Book {2, "BB", 18.0000M}},
category: 30
books: List<Book>() {Book {3, "CC", 30.0000M}},
}
更新
books.GroupBy(book => book.Price).Select(group => (group.Key, group.ToList()));
我可以得到分組的書籍串列,但不能按多個條件分組。
更新
謝謝大家的快速回答,似乎DotNet Developer回答更短更甜。
books.GroupBy(book => book.Price <= cheap ? cheap :
(book.Price > cheap && book.Price <= middle ? middle : expensive))
.Select(group => (group.Key, group.ToList()))
uj5u.com熱心網友回復:
帶三元條件運算子
books.GroupBy(b => b.Price < 10 ? 10 : (b.Price < 20 ? 20 : 30));
uj5u.com熱心網友回復:
GroupBy運算子需要一個回傳組鍵的函式或運算式。您可以使用它根據價格回傳組“名稱”:
var bins=books.GroupBy(b=> b.Price switch {
<=10 =>"cheap",
>10 and <= 20 => " medium",
_ => "expensive"})
.ToDictionary(g=>g.Key,g=>g);
結果是一個包含每個類別及其內容的字典:
Console.WriteLine(JsonSerializer.Serialize(bins));
-------
{
" medium":[{"Id":1,"Name":"AA","Price":19.0000},{"Id":2,"Name":"BB","Price":18.0000}],
"expensive":[{"Id":3,"Name":"CC","Price":30.0000}],
"cheap":[{"Id":4,"Name":"DD","Price":9.0000}]
}
我使用了模式匹配GroupBy來適應單個 lambda 中的所有條件。不過,這可能是一個單獨的功能:
string BookToBins(Book b)
{
if (b.Price <= 10) return "cheap";
if (b.Price <= 20) return "medium";
return "expensive";
}
...
var bins=books.GroupBy(BookToBins)
.ToDictionary(g=>g.Key,g=>g);
uj5u.com熱心網友回復:
首先 - 將類別添加到串列中
var newBookList = BookList.Select(x=> new { Book = x,
Category = x.Price <= 10 ? 10 :
x.Price <= 20 ? 20 :
30 } ).ToList();
然后按此類別分組:
var GroupedBooks = newBookList.GroupBy(x=>x.Category);
foreach(var category in GroupedBooks.Keys) {
Console.WriteLine("category : {0}", category);
foreach(var b in GroupedBooks[Keys].Select(x=>x.Book))
Console.Write("Book {0}, \"{1}\", {2}",b.Id, b.Name, b.Price);
}
類似的東西?
uj5u.com熱心網友回復:
如果您不一定受特定類別值的約束,而是希望按可被10(即10、20、30、40等)整除的價格對您的圖書進行分組,您可以通過向上舍入Price到最接近的值來實作此目的10并使用作為您的按值分組。
這是一個示例,Math.Ceiling()用于進行舍入:
Math.Ceiling(value / 10) * 10 // Round 'value' upwards to nearest 10
應用為按條件分組:
List<(decimal Category, List<Book> Books)> groupedBooks = books
.GroupBy(book => Math.Ceiling(book.Price / 10) * 10,
(category, booksInCategory) => (
Category: category,
Books: booksInCategory.ToList() ))
.OrderBy(gr => gr.Category)
.ToList();
使用您提供的示例串列books,結果groupedBooks包含:
類別:10
書:{ ID:4 名稱:DD 價格:9.0000 }
類別:20
書:{ ID:1 名稱:AA 價格:19.0000 }
書:{ ID:2 名稱:BB 價格:18.0000 }
類別:30
書: { ID:3 名稱:CC 價格:30.0000 }
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484604.html
上一篇:Vaadin回傳組件值
