【问题标题】:Linq select to new objectLinq 选择新对象
【发布时间】:2012-05-25 07:20:34
【问题描述】:

我有一个 linq 查询

var x = (from t in types select t).GroupBy(g =>g.Type)

它按对象的类型对对象进行分组,因此我希望拥有一个包含所有分组对象及其计数的新对象。像这样的:

type1, 30    
type2, 43    
type3, 72

更清楚地说:分组结果应该在一个对象中,而不是每个项目类型的对象中

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    阅读:101 LINQ Samples 来自 Microsoft MSDN 站点的 LINQ - Grouping Operators

    var x = from t in types  group t by t.Type
             into grp    
             select new { type = grp.key, count = grp.Count() };
    

    forsingle 对象利用 stringbuilder 并附加它,它将以字典的形式执行或转换它

        // fordictionary 
      var x = (from t in types  group t by t.Type
         into grp    
         select new { type = grp.key, count = grp.Count() })
       .ToDictionary( t => t.type, t => t.count); 
    
       //for stringbuilder not sure for this 
      var x = from t in types  group t by t.Type
             into grp    
             select new { type = grp.key, count = grp.Count() };
      StringBuilder MyStringBuilder = new StringBuilder();
    
      foreach (var res in x)
      {
           //: is separator between to object
           MyStringBuilder.Append(result.Type +" , "+ result.Count + " : ");
      }
      Console.WriteLine(MyStringBuilder.ToString());   
    

    【讨论】:

      【解决方案2】:

      这里的答案让我很接近,但在 2016 年,我能够编写以下 LINQ:

      List<ObjectType> objectList = similarTypeList.Select(o =>
          new ObjectType
          {
              PropertyOne = o.PropertyOne,
              PropertyTwo = o.PropertyTwo,
              PropertyThree = o.PropertyThree
          }).ToList();
      

      【讨论】:

        【解决方案3】:

        所有分组的对象,还是所有的类型?听起来你可能只是想要:

        var query = types.GroupBy(t => t.Type)
                         .Select(g => new { Type = g.Key, Count = g.Count() });
        
        foreach (var result in query)
        {
            Console.WriteLine("{0}, {1}", result.Type, result.Count);
        }
        

        编辑:如果你想要在字典中,你可以使用:

        var query = types.GroupBy(t => t.Type)
                         .ToDictionary(g => g.Key, g => g.Count());
        

        无需成对选择并然后构建字典。

        【讨论】:

        • 很抱歉有不清楚的问题。您的解决方案与我需要的非常相似,但我希望将所有分组结果放在单个对象中,而不是每个类型的对象
        • @Jeff:您接受的答案实际上与我的相同......只是在字典中。结果在一个对象中(query)。目前还不清楚我的解决方案不适合你想要实现什么。如果您要按类型分组,则必须 每个组有一个对象,但这里query 是一个查询,它将所有这些组.
        • 好吧,我知道我将在分组列表中查找哪些类型,因此将其放在字典中似乎很容易在查询之外创建对象
        • @Jeff:所以你确实想要一本字典? (仍然不是很清楚......)如果你想要一本字典,那很好 - 请参阅我的编辑,了解一种比公认答案更简单的构建字典的方法。
        • 这与我的预期有点不同,但因为我可以拥有它,所以它足以解决我的问题。非常感谢您的帮助
        【解决方案4】:
        var x = from t in types
                group t by t.Type into grouped
                select new { type = grouped.Key,
                             count = grouped.Count() };
        

        【讨论】:

        • 附带问题:一般来说,如果您执行 select new {..},它会在您 updateChanges 时在数据库中插入一些东西吗?
        • @DanyKhalife 您在使用 select 语句时不需要调用 updateChanges。如果你使用它,它不会插入任何东西,它只会在 DB 中执行一条 select 语句。
        【解决方案5】:

        如果您希望能够对每种类型执行查找以获取其频率,那么您需要将枚举转换为字典。

        var types = new[] {typeof(string), typeof(string), typeof(int)};
        var x = types
                .GroupBy(type => type)
                .ToDictionary(g => g.Key, g => g.Count());
        foreach (var kvp in x) {
            Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value);
        }
        Console.WriteLine("string has a count of {0}", x[typeof(string)]);
        

        【讨论】:

          【解决方案6】:

          这是一篇很棒的文章,介绍了从 LINQ 查询创建新对象所需的语法。

          但是,如果填充对象字段的赋值不仅仅是简单的赋值,例如,将字符串解析为整数,并且其中一个失败,则无法调试。您不能在任何单个分配上创建断点。

          如果你把所有的赋值都移到一个子程序中,并从那里返回一个新对象,并尝试在那个程序中设置一个断点,你可以在那个程序中设置一个断点,但是断点永远不会被触发。

          所以而不是:

          var query2 = from c in doc.Descendants("SuggestionItem")
                          select new SuggestionItem
                                 { Phrase = c.Element("Phrase").Value
                                   Blocked = bool.Parse(c.Element("Blocked").Value),
                                   SeenCount = int.Parse(c.Element("SeenCount").Value)
                                 };
          

          或者

          var query2 = from c in doc.Descendants("SuggestionItem")
                                   select new SuggestionItem(c);
          

          我是这样做的:

          List<SuggestionItem> retList = new List<SuggestionItem>();
          
          var query = from c in doc.Descendants("SuggestionItem") select c;
          
          foreach (XElement item in query)
          {
              SuggestionItem anItem = new SuggestionItem(item);
              retList.Add(anItem);
          }
          

          这让我可以轻松调试并找出哪个作业失败了。在这种情况下,XElement 缺少我正在解析以在 SuggestionItem 中设置的字段。

          我在为新的库例程编写单元测试时遇到了 Visual Studio 2017 的这些问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多