C#从IList中选择元素

3
我有一个对象列表,IList<O>O 有几个属性,但只有两个是相关的:DateDuration
我想要将列表“拆分”成多个列表,这些列表仅包含具有匹配日期和持续时间属性的对象。
例如:
0- Date==1, Duration==7  
1- Date==1, Duration==7  
2- Date==2, Duration==7  
3- Date==2, Duration==7  
4- Date==2, Duration==14  
5- Date==2, Duration==14  
期望结果(IList<IList<O>>):
0-  
 0- Date==1, Duration==7  
 1- Date==1, Duration==7  
1-  
 0- Date==2, Duration==7  
 1- Date==2, Duration==7  
2-  
 0- Date==2, Duration==14  
 1- Date==2, Duration==14  
我知道可以使用一些 LINQ 选择来完成此操作,但不确定如何操作。

我已经跟进了Brian R. Bondy提供的链接,如果我再多读一些,我肯定会在那里找到解决方案,但是Ben Lings提供了解决方案。来自call me Steve和Mark Brackett的另外两个答案接近,但它们只按日期分组。所选答案非常有效。 - drupop
4个回答

4
您可以使用以下内容:
var query = 
    from item in list
    group item by new { item.Date, item.Duration } into g
    select g.toList();
var result = query.toList();

这将创建一个匿名类,其中包含您想要按组进行分组的属性。然后将IGrouping扩展为原始类型的List。然后运行查询以生成外部List


虽然我很感激所有的回答,但这个回答正好符合我的需求。感谢大家抽出时间来帮助我。 - drupop

2

请参阅分组运算符以获取嵌套的LINQ结果。

以下是我链接到的网站上的示例:

public void Linq40()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

    var numberGroups =
        from n in numbers
        group n by n % 5 into g
        select new { Remainder = g.Key, Numbers = g };

    foreach (var g in numberGroups)
    {
        Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);
        foreach (var n in g.Numbers)
        {
            Console.WriteLine(n);
        }
    }
}

2
这将为您提供一个 IEnumerable<IGrouping<Date, O>>,接近您想要的内容。
list.GroupBy(i => new { Date = i.Date, Duration = i.Duration });

为了获得一个真正的IList<IList<O>>,你需要进一步细化,从IGrouping中获取IEnumerable<O>
list.GroupBy(i => new { Date = i.Date, Duration = i.Duration })
    .Select(g => g.ToList()).ToList();

@drupop - 我想我应该好好练习我的阅读理解能力。;) 已修复。 - Mark Brackett

2

我正在学习Linq,所以我尝试找出一个解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace so_listobj
{
    class Program
    {
        static void Main(string[] args)
        {
            List<O> anOList = new List<O>();
            List<List<O>> aGroupOList = new List<List<O>>();

            anOList.Add(new O(1, 7));
            anOList.Add(new O(1, 7));
            anOList.Add(new O(2, 2));
            anOList.Add(new O(2, 2));
            anOList.Add(new O(2, 14));
            anOList.Add(new O(2, 14));

            Console.Out.WriteLine("Initial state");

            foreach (O o in anOList)
            {
                Console.Out.WriteLine(o);
            }

            var grp =
                from o in anOList
                group o by o.Date into a
                select new {Date = a.Key, aGroupOList = a  };

            Console.Out.WriteLine("after grouping");

            foreach (var _ob in grp)
            {
                foreach (var _anotherOList in _ob.aGroupOList)
                {
                    Console.Out.WriteLine("{0} {1}", _ob.Date, _anotherOList.ToString());
                }
            }
        }
    }


    class O
    {
        private int  _Odate;
        private int _Oduration;

        public O(int date, int duration)
        {
            _Odate = date;
            _Oduration = duration;
        }

        public int Date
        {
            get { return _Odate; }
            set { _Odate = value; }
        }
        public int Duration
        {
            get { return _Oduration; }
            set { _Oduration = value; }
        }


        public override String ToString()
        {
            return String.Format("- Date :{0}\t Duration:{1}", _Odate, _Oduration);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接