C# Linq选择新对象

C# Linq选择新对象,c#,linq,group-by,C#,Linq,Group By,我有一个linq查询 var x = (from t in types select t).GroupBy(g =>g.Type) 它按对象的类型对对象进行分组,因此我希望有一个包含所有分组对象及其计数的新对象。大概是这样的: type1, 30 type2, 43 type3, 72 更清楚的是:分组结果应该在一个对象中,而不是每个项目类型的对象所有分组对象,还是所有类型?听起来你可能只是想: var query = types.GroupBy(t => t.T

我有一个linq查询

var x = (from t in types select t).GroupBy(g =>g.Type)
它按对象的类型对对象进行分组,因此我希望有一个包含所有分组对象及其计数的新对象。大概是这样的:

type1, 30    
type2, 43    
type3, 72
更清楚的是:分组结果应该在一个对象中,而不是每个项目类型的对象

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

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());
无需成对选择,然后构建字典。

阅读:从Microsoft MSDN站点

var x = from t in types  group t by t.Type
         into grp    
         select new { type = grp.key, count = grp.Count() };
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)]);
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());   

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

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

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

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

这是一篇很好的文章,介绍了从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)
                       };

相反,我这样做了:

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);
}
List retList=newlist();
var query=从文档中的c。子体(“SuggestionItem”)选择c;
foreach(查询中的XElement项)
{
SuggestionItem anItem=新的SuggestionItem(项目);
retList.Add(anItem);
}
这使我能够轻松地调试并找出失败的任务。在本例中,XElement缺少一个我正在解析的字段,以便在SuggestionItem中设置


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

对于这个不明确的问题,我深表歉意。您的解决方案与我需要的非常相似,但我希望所有分组结果都在单个对象中,而不是每个对象中都有一个对象type@Jeff当前位置您接受的答案实际上与我的相同。。。只是在字典里。结果都在一个对象中(
query
)。我的解决方案对您没有帮助,但您想要实现什么还不清楚。如果要按类型分组,每个组必须有一个对象,但这里的
query
查询将为您提供所有这些组。我知道我将在分组列表中查找哪些类型,因此在字典中创建一个对象似乎很容易query@Jeff:那么你想要一本字典?(还不太清楚…)如果你想要一本字典,那很好-查看我的编辑,了解一种比公认答案更简单的构建字典的方法。这与我所期望的略有不同,但既然我可以拥有它,它就足以解决我的问题。非常感谢帮助端的问题:一般来说,如果您执行select new{..},那么当您使用updateChanges时,它是否会在DB中插入一些内容?@DanyKhalife当您使用select语句时,您不需要调用updateChanges。如果使用,它将不插入任何内容,只在DB中执行select语句。
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);
}