Tag: group by

LINQ Group通过多个ref-type字段; 自定义EqualityComparer

所以我在SO和其他地方看了大约20个例子,但没有找到一个涵盖我正在尝试做的事情。 这个 – 我可以指定我的显式类型比较器内联吗? – 看起来像我需要的东西,但不够远(或者我不明白如何进一步采取它)。 我有一个LoadData列表,LoadData对象包含引用和值类型的字段 需要对ref和value字段的混合进行分组,将输出投影为匿名类型 需要(我认为)提供自定义IEqualityComparer来指定如何比较GroupBy字段,但它们是匿名类型 private class LoadData { public PeriodEndDto PeriodEnd { get; set; } public ComponentDto Component { get; set; } public string GroupCode { get; set; } public string PortfolioCode { get; set; } } 我到目前为止最好的GroupBy查询: var distinctLoads = list.GroupBy( dl => new { PeriodEnd = dl.PeriodEnd, Component […]

从列表值c#动态创建匿名对象

我有一个列表(或可以是数组)的字符串,我想动态创建一个匿名对象。 我该怎么做呢? var dataSet = new DataSet(); dataSet.ReadXml(@””); var dataTable = dataSet.Tables[0]; var dataRow = dataTable.Rows[0]; var keys = new List {“Column1″,”Column2”}; var result = new {keys[0] = dataRow[keys[0]], keys[1] = dataRow[keys[1]]} 因此,名为“keys”的列表将在此方法之外创建,并且可以包含1到多个值。 我尝试创建一个字典并循环遍历列表并向字典添加键/值对,但后来我无法弄清楚如何将字典转换回匿名类型。 我也尝试过expando对象,但这似乎并没有让我更进一步。 我必须能够返回一个匿名类型,因为此方法的结果将与LINQ查询的GroupBy子句一起使用。 这是我必须动态创建字典的方法: public object Key(DataRow dataRow, List keys) { var dictionary = new IDictionary; foreach (string key in keys) { […]

使用LINQ根据它们将包含的已知子字符串对字符串列表进行分组

我有一个已知的字符串列表,如下所示: List groupNames = new List(){“Group1″,”Group2″,”Group3”}; 我还有一个事先不知道的字符串列表,如下所示: List dataList = new List() { “Group1.SomeOtherText”, “Group1.SomeOtherText2”, “Group3.MoreText”, “Group2.EvenMoreText” }; 我想做一个LINQ语句,它将获取dataList并将其转换为匿名对象或具有组名的Key的字典和包含该组中字符串列表的Value。 目的是循环遍历组并在组列表上进行内部循环,并根据字符串所在的字符串对字符串执行不同的操作。 我想要一个看起来像这样的数据结构: var grouped = new { new { Key=”Group1″, DataList=new List() { “Group1.SomeOtherText”, “Group1.SomeOtherText2″ } }, new { Key=”Group2”, DataList=new List() { “Group2.EvenMoreText” } } … }; 我知道我可以循环遍历dataList,然后检查每个字符串是否包含组名,然后将它们添加到单个列表中,但我正在尝试学习LINQ执行此类任务的方式。 提前致谢。 编辑: 刚才有了另一个想法……如果我的团体名字在Enum中怎么办? public enum Groups { […]

C#列表 – 分组 – 没有Linq

我有一个对象: IObject { string Account, decimal Amount } 如何按帐户分组并汇总金额,返回没有Linq的列表。 2.0框架……这就是为什么没有Linq。 这是我有的: ListofObjects = List; foreach (var object in objects) { var objectToAdd = new Object(object); var oa = ListofObjects.Find(x => x.Account == objectToAdd.Account); if (oa == null) { ListofObjects.Add(objectToAdd); } else { ListofObjects.Remove(oa); oa.Amount = objectToAdd.Amount; ListofObjects.Add(oa); } }

按范围分组使用linq

我们如何使用分组范围等于或大于? var data = new[] { new { Id = 0, Price = 2 }, new { Id = 1, Price = 10 }, new { Id = 2, Price = 30 }, new { Id = 3, Price = 50 }, new { Id = 4, Price = 120 }, new { Id = […]

按任意时间间隔对DateTime进行分组

我有一个IEnumerable的项类定义如下: public class Item { public DateTime Date { get; private set; } public decimal? Value { get; private set; } public Item(DateTime date, decimal? value) { Date = date; Value = value; } } 这些项目在特定的时间间隔内(例如5分钟)。 我需要按日期对它们进行分组,但需要更改间隔。 例如,如果项目按以下顺序排列: 2010-08-24 00:05 2010-08-24 00:10 2010-08-24 00:15 2010-08-24 00:20 2010-08-24 00:25 2010-08-24 00:30 我想将它们分成15分钟的间隔,结果应如下所示: 2010-08-24 00:15 2010-08-24 00:30 […]

使用GroupBy和Average将SQL转换为lambda LINQ

我花了几个小时试图将简单的SQL翻译成lambda LINQ SELECT ID, AVG(Score) FROM myTable GROUP BY ID 任何的想法?

C#LINQ – 如何动态构建Group By子句

我正在处理应用程序,用户可以在其中选择他/她想要在屏幕上看到的列以及要分组或聚合的列。 因此,在我的LINQ部分中,我实际上应该将包含列名的变量传递给group by和aggregate子句。 请记住, DataTable dt每次都可能包含不同的数据(例如员工信息,采购订单,性能统计等)。 我只能通过dt.Columns[i].ColumnName和dt.Columns[i].DataType.Name在运行时获取有关数据的信息。 任何人都可以建议如何做到这一点,我需要的是这样的事情: SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); var query = from row in dt.AsEnumerable() group row by new { foreach(DataColumn column in dt.Columns) { row[column.ColumnName]; } } into grp select new { foreach(DataColumn column in dt.Columns) { if(column.DataType.Name == “Decimal”) { Sum(grp[column.ColumnName]); }else{ […]

LINQ – 选择每组最大属性值的记录

我有一个这样的数据集: GroupName GroupValue MemberName MemberValue ‘Group1’ 1 ‘Member1’ 1 ‘Group1’ 1 ‘Member2’ 2 ‘Group2’ 2 ‘Member3’ 3 ‘Group2’ 2 ‘Member4’ 2 ‘Group3’ 2 ‘Member5’ 4 ‘Group3’ 2 ‘Member6’ 1 我想要选择的是每个GroupName具有最大MemberValue的行,但仅适用于具有最大GroupValue GroupName ,并将它们传递给委托函数。 像这样: ‘Group2’ 2 ‘Member3’ 3 ‘Group3’ 2 ‘Member5’ 4 到目前为止我已经尝试过这种格式…… data.Where(maxGroupValue => maxGroupValue.GroupValue == data.Max(groupValue => groupValue.GroupValue)) .Select(FunctionThatTakesData) ……但这只是给了我Group2和Group3的每个成员。 我已经尝试在Select() GroupBy()之前放置一个GroupBy() ,但是将输出转换为IGrouping所以FunctionThatTakesData()不知道该如何处理它,我不能再做另一个Where()仅过滤掉最大的MemberValue 。 […]

根据组计数排序列表

我想对IGrouping的元素数量进行排序。 就是这样,理想情况下列表应该是相同的。 我会妥协一个新的列表,但那么元素应该是完全相同的原始对象,而不是副本(不管是浅的),绝对不是匿名对象。 具体来说:我们有一个具有许多属性的实体,以及这种类型的对象列表。 我们希望(1)通过某些属性(名称,地址,……)对对象进行分组,然后(2)计算每个组中元素的数量。 最后,我们希望(3)通过首先放置属于较大组的元素,根据这些计数对列表进行重新排序。 注意:我们的主要问题是我们似乎无法找到一种方法来保持对组元素中原始对象的引用。 事实上,我们可以在Linq查询中选择的是分组键(或键的属性),并且IGrouping不会显示任何其他内容。 我们无法弄清楚如何将组元素与列表元素相关联,而不是查看数据(即便如此,我们还需要主键,我们无法将其添加到分组键或它会破坏分组开始的目的)。