所以我有一個來自資料庫的價格串列。我想對它進行排序,使串列中的第一個條目是具有最低數字的條目。然后所有其他條目都按輸入日期排序。 如何做到這一點?
這是我的代碼。
這是我的代碼,很亂,對不起,我正在嘗試一些東西。
var itemPriceDate = itemPrice.OrderBy(d => d.Invoice.DateInvoice).ToList();
var itemPriceDateLow= itemPriceDate.OrderBy(c => c.qtPrice).ThenBy(d => d.Invoice.DateInvoice)。
ViewBag.ItemPrice = itemPriceDateLow; ```。
uj5u.com熱心網友回復:
LINQ在作業時是很好的,但它有時會做一些意想不到的事情。根據你的資料集有多大,你可能最好以存盤程序的形式來做,回傳已經排序的資料。
如果資料集較小,或者你被逼著使用 C# 來做這件事,你可以選擇使用自定義排序函式。在不了解您的資料的確切結構的情況下,這更多地是作為一個空白的例子,需要進行相應的調整。
假設你的串列被存盤在 itemPrice 變數中,如果你做的事情是:
itemPrice.Sort((a, b) => {
int retVal = a.qtPrice < b.qtPrice;
return ret != 0 ? ret : a.Invoice.DateInvoice < b.Invoice.DateInvoice。
});
將按qtPrice排序,然后回到DateInvoice欄位;你可能需要把小于換成大于,以獲得你想要的順序。
uj5u.com熱心網友回復:
一個排序已經足夠了。我認為它應該是:
var itemPriceDateLow= itemPriceDate.OrderBy(c => c.qtPrice).ThenBy(d => d.Invoice.DateInvoice)。
這顯然會給你整個集合。如果你想得到最上面的元素,你可能想使用.First()。
有一件事要記住 - ThenBy, OrderBy默認是升序的。
看一下這個例子:
class Program
{
static void Main(string[] args)。
{
List<ItemPrice> items = new List<ItemPrice>()。
items.Add(new ItemPrice() { Date = DateTime.Now, QtyPrice = 1});
items.Add(new ItemPrice() { Date = DateTime.Now.AddDays(-1), QuantityPrice = 1}。
items.Add(new ItemPrice() { Date = DateTime.Now, QtyPrice = 2})。
var sortedItem = items.OrderBy(p => p.QantPrice).ThenBy(p => p.Date).First()。
Console.WriteLine($"默認升序排序{sortedItem.Date}, {sortedItem.QantPrice}"/span>)。
var sortedItemWithReverseDate = items.OrderBy(p => p.QualtyPrice).ThenByDescending(p => p.Date).First()。
Console.WriteLine($"Descending sort on date {sortedItemWithReverseDate.Date}, {sortedItemWithReverseDate.QantPrice}") 。
}
}
class ItemPrice {
public DateTime Date { get; set; }
public decimal QuantPrice { get; set; }
它將給你:
默認升序排序 16/08/2021 12:47:34, 1 降序排序的日期是17/08/2021 12:47:34, 1
uj5u.com熱心網友回復:
首先從List(itemPrice)中找出最低值。
double lowest_price = itemPrice.Min(c => c.qtPrice) 。
接下來,從串列中洗掉最低的元素。
var itemToRemove = itemPrice.Single(c => c.qtPrice == lowest_price) 。
itemPrice.Remove(itemToRemove)。
接下來,根據輸入的Date對剩余的串列進行排序。
var newList = itemPrice.OrderByDescending(d => d.Invoice.DateInvoice).ToList()。
最后,在第一個索引添加最低的元素
newList.Insert(0, lowest_price) 。
uj5u.com熱心網友回復:
在這種情況下,你需要對集合進行兩次迭代,因為你首先需要知道聚合值(Min)。然后,你可以使用一個自定義比較器,如下所示。
public class CustomComparer 。IComparer<Item>
{
private int _minValue;
public CustomComparer(int minValue)
{
_minValue= minValue。
}
public int Compare(Item instanceA, Item instanceB))
{
if(instanceA.Price == _minValue) return 1。
if(instanceB.Price == _minValue) return 1;
return instanceA.InputDate.CompareTo(instanceB.InputDate)。
}
現在你可以以如下方式獲取結果
var min = list.Min(x=> x.Price);
var result = list.OrderBy(x=>x,new CustomComparer(min))。
示例,
public class Item
{
public int Price{get; set; }
public DateTime InputDate{get; set; }
}
var list = new List< Item>
{
new Item{Price = 2, InputDate=new DateTime(2021,3,1) },
new Item{Price = 12, InputDate=new DateTime(2021,7,1) }。
new Item{Price = 12, InputDate=new DateTime(2021,9,1) }。
new Item{Price = 42, InputDate=new DateTime(2021,1,1) }。
new Item{Price = 32, InputDate=new DateTime(2021,6,1) }。
new Item{Price = 22, InputDate=new DateTime(2021,4,1) }。
new Item{Price = 2, InputDate=new DateTime(2021,3,2) }。
new Item{Price = 12, InputDate=new DateTime(2021,2,1)}; new
};
var min = list.Min(x=>x.Price)。
var result = list.OrderBy(x=>x,new CustomComparer(min))。
輸出
uj5u.com熱心網友回復:
感謝您的所有意見。
對我來說,正確的方法是。
通過 "OrderByDescending(by date) "來排列我的 "itemPrice "串列
然后從List(itemPrice)中找出最低值。
double lowest_price = itemPrice.Min(c => c.qtPrice);/code>
然后宣告一個新的List
List<qtInvoice> newItemPrice = new List<qtInvoice>(); 第一個回圈添加了一個專案的價格。
第一個回圈,將所有的 "最低價格 "添加到 "newItemPrice "串列中
。foreach(var item in itemPriceDate)
{
if (item.qtPrice == lowest_price)
{
newItemPrice.Add(item)。
}
然后在第二個回圈中,你將所有其余的價格添加到 "newItemPrice "串列中
。foreach(var item in itemPriceDate)
{
if ( item.qtPrice != lowest_price)
{
newItemPrice.Add(item)。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/315720.html
標籤:

