【问题标题】:C# select elements from IListC# 从 IList 中选择元素
【发布时间】:2010-04-12 23:36:29
【问题描述】:

我有一个对象列表,IList<O>O 有几个属性,但只有两个是相关的:DateDuration

我想将列表“拆分”为几个列表,其中仅包含具有匹配日期和持续时间属性的对象。

例子:

0- 日期==1,持续时间==7 1- 日期==1,持续时间==7 2- 日期==2,持续时间==7 3-日期==2,持续时间==7 4-日期==2,持续时间==14 5- 日期==2,持续时间==14

想要的结果(IList>):

0- 0- 日期==1,持续时间==7 1- 日期==1,持续时间==7 1- 0- 日期==2,持续时间==7 1- 日期==2,持续时间==7 2- 0- 日期==2,持续时间==14 1- 日期==2,持续时间==14

我知道这可以通过一些 LINQ 选择来完成,但不确定如何。

【问题讨论】:

  • 我已经跟进了 Brian R. Bondy 提供的链接,我确信通过更多阅读我会在那里找到解决方案,但 Ben Lings 提供了解决方案。叫我史蒂夫和马克布拉克特的另外两个答案很接近,但他们只按日期分组。选择的答案效果很好。

标签: c# linq


【解决方案1】:

您可以使用以下内容:

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

【讨论】:

  • 尽管我很欣赏所有答案,但这正是我所需要的。感谢大家抽出宝贵的时间。
【解决方案2】:

查看grouping operator 了解嵌套的 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);
        }
    }
}

【讨论】:

    【解决方案3】:

    我正在学习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);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这会给你一个IEnumerable&lt;IGrouping&lt;Date, O&gt;&gt;,这与你想要的很接近。

      list.GroupBy(i => new { Date = i.Date, Duration = i.Duration });
      

      要获得实际的IList&lt;IList&lt;O&gt;&gt;,您必须通过将IEnumerable&lt;O&gt;IGrouping 中取出来进一步完善:

      list.GroupBy(i => new { Date = i.Date, Duration = i.Duration })
          .Select(g => g.ToList()).ToList();
      

      【讨论】:

      • @drupop - 我想我应该提高阅读理解能力。 ;) 固定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多