从列表值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) { dictionary.Add(key, dataRow[key]); } return dictionary; } 

这是我的LINQ查询:

 var duplicates = dataTable.AsEnumerable().GroupBy(r => Key(r, keys)).Where(c => c.Count() > 1).ToList(); 

如果我从Key()方法硬编码匿名类型,则GroupBy子句有效。 基本上我只需要根据键列表中的值动态设置GroupBy子句。

删除你的问题,你想要的是能够根据运行时属性对项列表进行分组,运行时属性可以由该项的一个或多个属性组成。 从本质上讲,它意味着您需要一个将项目转换为键的选择器function(这是您的Key方法)。

为了使GroupBy工作,它需要能够比较密钥的任何两个实例以查看它们是否相等。 这意味着密钥需要实现有意义的Equals()方法,或者您需要一个为您工作的IEqualityComparer实现。 在这种情况下,我不打算创建一个新的Key,只需编写一个可以直接比较两个DataRows的Equality Comparer:

 var duplicates = dataTable .AsEnumerable() .GroupBy(r => r, new MyDataRowComparer(keys)) .Where(c => c.Count() > 1) .ToList(); internal class MyDataRowComparer : IEqualityComparer { private readonly string[] _keys; public MyDataRowComparer(string[] keys) { _keys = keys; // keep the keys to compare by. } public bool Equals(DataRow x, DataRow y) { // a simple implementation that checks if all the required fields // match. This might need more work. bool areEqual = true; foreach (var key in _keys) { areEqual &= (x[key] == y[key]); } return areEqual; } public int GetHashCode(DataRow obj) { // Add implementation here to create an aggregate hashcode. } }