首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Order IGrouping in C#

Order IGrouping in C#
EN

Stack Overflow用户
提问于 2022-11-12 17:16:04
回答 3查看 82关注 0票数 -1

示例在这里,应该在在线编译器中工作:

代码语言:javascript
复制
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建议这样做,但是它会引发运行时异常- Unable to cast object of type System.Linq.OrderedEnumerable to System.Linq.IGrouping

我暂时没有想法了,但是没有办法绕过它--我绝对需要在那里订购它。

编辑

我目前的解决方案是使用Select(x => x)IGrouping扁平化为普通List,这样我就可以轻松地排序和编辑值,而不会丢失对grouped的引用。如果你真的想保留IGrouping,那么你运气不好,似乎是不可能的。

EN

回答 3

Stack Overflow用户

发布于 2022-11-12 17:34:28

尝尝这个。

代码语言:javascript
复制
 var grouped = list.GroupBy(x => x.Val1).Select(a=> a.OrderBy(a=>a.Val2).ToList());

OrderBy返回IOrderedEnumerable,您不能将其转换为IGrouping

票数 0
EN

Stack Overflow用户

发布于 2022-11-12 17:58:05

您的示例代码没有显示您要达到的目的。

代码语言:javascript
复制
list.OrderBy(x => x.Val2); //list will be ordered, but not saved

OrderBy不按原样订购现有的集合。它实际上返回了一个新集合。

代码语言:javascript
复制
list = (IGrouping<int, Item>)list.OrderBy(x => x.Val2); //exception

OrderBy返回一个IOrderedEnumerable<TElement>IOrderedEnumerable<TElement>IGrouping<TKey,TElement>都是从IEnumerable<TElement>派生的,但是不能将IOrderedEnumerable转换为IGrouping

如果您只想写出值,那么Func可以是:

代码语言:javascript
复制
        public IEnumerable<Item> Func(IGrouping<int, Item> list)
        {
            return list.OrderBy(x => x.Val2);
        }

而foreach循环可以是:

代码语言:javascript
复制
            foreach(var group in grouped)
            {
                var orderedList = p.Func(group);
                Console.WriteLine($"group: {group.Key}");
                foreach (var value in orderedList)
                {
                    Console.WriteLine($" {value.Val2}");
                }
            }

希望这能帮上忙。

票数 0
EN

Stack Overflow用户

发布于 2022-11-13 09:17:40

在末尾使用First方法,以便获得有序项的IGrouping集合。

代码语言:javascript
复制
public void Func(IGrouping<int, Item> list)
{
   list = list.OrderBy(x => x.Val2).GroupBy(x => x.Val1).First(); 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74414995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档