gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:19 25 4
gpt4 key购买 nike

我有一个字符串列表(或者可以是数组),我想从中动态创建一个匿名对象。我该怎么做?

var dataSet = new DataSet();
dataSet.ReadXml(@"");
var dataTable = dataSet.Tables[0];
var dataRow = dataTable.Rows[0];

var keys = new List<string> {"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<String> keys)
{
var dictionary = new IDictionary<string, object>;
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 子句。

最佳答案

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

为了让 GroupBy 工作,它需要能够比较键的任意两个实例以查看它们是否相等。这意味着 key 需要实现一个有意义的 Equals() 方法,或者您需要一个为您完成工作的 IEqualityComparer 实现。在这种情况下,我不会费心创建一个新的键,只需编写一个可以直接比较两个数据行的相等比较器:

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


internal class MyDataRowComparer : IEqualityComparer<DataRow>
{
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.
}
}

关于c# - 从列表值动态创建匿名对象 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com