45

我有一个 linq 查询

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

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

type1, 30    
type2, 43    
type3, 72

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

4

6 回答 6

48

阅读:该 LINQ 中的101 个 LINQ 示例-来自 Microsoft MSDN 站点的分组运算符

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());   
于 2012-05-25T07:25:51.673 回答
48

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

List<ObjectType> objectList = similarTypeList.Select(o =>
    new ObjectType
    {
        PropertyOne = o.PropertyOne,
        PropertyTwo = o.PropertyTwo,
        PropertyThree = o.PropertyThree
    }).ToList();
于 2016-03-24T17:56:07.297 回答
39

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

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());

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

于 2012-05-25T07:25:01.567 回答
3
var x = from t in types
        group t by t.Type into grouped
        select new { type = grouped.Key,
                     count = grouped.Count() };
于 2012-05-25T07:28:32.807 回答
1

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

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)]);
于 2012-05-25T07:41:38.187 回答
1

这是一篇很棒的文章,介绍了从 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 中遇到了这些问题。

于 2018-01-31T02:38:08.867 回答