示例在這里,應該在在線編譯器中作業:
internal class Program
{
static void Main(string[] args)
{
var i1 = new Item();
i1.Val1 = 1;
i1.Val2 = 2.1;
var i2 = new Item();
i2.Val1 = 1;
i2.Val2 = 1.5;
var i3 = new Item();
i3.Val1 = 3;
i3.Val2 = 0.3;
var list = new List<Item>
{
i1,
i2,
i3
};
var grouped = list.GroupBy(x => x.Val1);
Program p = new Program();
foreach(var group in grouped)
p.Func(group);
}
public void Func(IGrouping<int, Item> list)
{
list.OrderBy(x => x.Val2); //list will be ordered, but not saved
list = (IGrouping<int, Item>)list.OrderBy(x => x.Val2); //exception
}
}
public class Item
{
public int Val1 { get; set; }
public double Val2 { get; set; }
}
這是我正在嘗試做的簡化代碼——我需要在里面訂購串列Func,但我不知道如何。第一行在理論上有效,但由于它不是空的,因此在實踐中不起作用 - 串列實際上并未排序。
第二行應該作業,實際上 Visual Studio 建議,但它拋出運行時例外 -Unable to cast object of type System.Linq.OrderedEnumerable to System.Linq.IGrouping。
我暫時沒有想法,但沒有辦法繞過它——我絕對需要在那里訂購。
uj5u.com熱心網友回復:
嘗試這個。
var grouped = list.GroupBy(x => x.Val1).Select(a=> a.OrderBy(a=>a.Val2).ToList());
OrderBy回傳IOrderedEnumerable你不能把它投到IGrouping
uj5u.com熱心網友回復:
您的示例代碼沒有顯示您想要達到的目標。
list.OrderBy(x => x.Val2); //list will be ordered, but not saved
OrderBy不會就地訂購現有串列。它有效地回傳一個新的集合。
list = (IGrouping<int, Item>)list.OrderBy(x => x.Val2); //exception
OrderBy回傳一個IOrderedEnumerable<TElement>. IOrderedEnumerable<TElement>和都IGrouping<TKey,TElement>派生自IEnumerable<TElement>但您不能將 anIOrderedEnumerable轉換為IGrouping.
如果你只想寫出值,那么 Func 可以是:
public IEnumerable<Item> Func(IGrouping<int, Item> list)
{
return list.OrderBy(x => x.Val2);
}
foreach 回圈可以是:
foreach(var group in grouped)
{
var orderedList = p.Func(group);
Console.WriteLine($"group: {group.Key}");
foreach (var value in orderedList)
{
Console.WriteLine($" {value.Val2}");
}
}
希望這會有所幫助。
uj5u.com熱心網友回復:
最后使用First方法以獲得 IGrouping 有序專案集合。
public void Func(IGrouping<int, Item> list)
{
list = list.OrderBy(x => x.Val2).GroupBy(x => x.Val1).First();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533359.html
標籤:C#。网
