如何将字符串列表转换为每个字符 属性 的匿名类型
How to turn a list of strings into an anonymous type with a property per character
假设我有一个 List<string>
,其中每个字符串的长度相同。这个长度是事先不知道的,只能通过在 运行 时间检查字符串的长度 属性 来确定(比如第一个,因为它们都是相同的长度)。
我想要的是得到一组匿名对象,每个对象都有属性 C1、C2 等,每个角色一个。
因此,如果列表中的第一个字符串是 "abcd",那么结果列表中的第一个匿名对象将是...
{
C1 = "a",
C2 = "b",
C3 = "c",
C4 = "d"
}
这可能吗?我一直在与动力学和 ExpandoObjects 作斗争,但没有设法使它们中的任何一个工作。主要问题似乎是事先不知道 属性 个名字。
我尝试过(循环)...
d["C" + i] = str.[j];
...但这不起作用,因为它认为我正在尝试使用数组索引。我得到 "Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject'"
的 运行 次异常
这可以做到吗?
您可以将 ExpandoObject
视为字典,其中 属性 名称作为键,值作为 属性 值。使用这个简单的扩展方法,您可以创建一个 ExpandoObject 并使用从源字符串生成的属性填充它:
public static ExpandoObject ToExpando(this string s)
{
var obj = new ExpandoObject();
var dictionary = obj as IDictionary<string, object>;
var properties = s.Distinct().Select((ch, i) => new { Name = $"C{i+1}", Value = ch });
foreach (var property in properties)
dictionary.Add(property.Name, property.Value);
return obj;
}
用法:
var source = new List<string> { "bob", "john" };
var result = source.Select(s => s.ToExpando());
输出:
[
{
"C1": "b",
"C2": "o"
// NOTE: If C3 = "b" is required here, than remove Distinct() in extension method
},
{
"C1": "j",
"C2": "o",
"C3": "h",
"C4": "n"
}
]
假设我有一个 List<string>
,其中每个字符串的长度相同。这个长度是事先不知道的,只能通过在 运行 时间检查字符串的长度 属性 来确定(比如第一个,因为它们都是相同的长度)。
我想要的是得到一组匿名对象,每个对象都有属性 C1、C2 等,每个角色一个。
因此,如果列表中的第一个字符串是 "abcd",那么结果列表中的第一个匿名对象将是...
{
C1 = "a",
C2 = "b",
C3 = "c",
C4 = "d"
}
这可能吗?我一直在与动力学和 ExpandoObjects 作斗争,但没有设法使它们中的任何一个工作。主要问题似乎是事先不知道 属性 个名字。
我尝试过(循环)...
d["C" + i] = str.[j];
...但这不起作用,因为它认为我正在尝试使用数组索引。我得到 "Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject'"
的 运行 次异常这可以做到吗?
您可以将 ExpandoObject
视为字典,其中 属性 名称作为键,值作为 属性 值。使用这个简单的扩展方法,您可以创建一个 ExpandoObject 并使用从源字符串生成的属性填充它:
public static ExpandoObject ToExpando(this string s)
{
var obj = new ExpandoObject();
var dictionary = obj as IDictionary<string, object>;
var properties = s.Distinct().Select((ch, i) => new { Name = $"C{i+1}", Value = ch });
foreach (var property in properties)
dictionary.Add(property.Name, property.Value);
return obj;
}
用法:
var source = new List<string> { "bob", "john" };
var result = source.Select(s => s.ToExpando());
输出:
[
{
"C1": "b",
"C2": "o"
// NOTE: If C3 = "b" is required here, than remove Distinct() in extension method
},
{
"C1": "j",
"C2": "o",
"C3": "h",
"C4": "n"
}
]