如果问题标题令人困惑,请提前道歉。我将尝试通过一个示例进行解释,希望它会很清楚。
我有一个像下面这样的课程:
class A
{
Dictionary<string,string> myDict;
}
我想使用一些输入来创建具有上述类的列表(例如:List),这将是以下类型的另一个List:
class input
{
public string elem1;
public string elem2;
public string elem2;
public string elem2;
}
Ex: List<input> inputList;
我使用如下所示的foreach循环完成了相同的操作。我想知道,是否可以更好地使用LINQ来完成相同的工作:
var result = new List<A>();
foreach (var l in inputList)
{
var r = new A();
r.myDict.Add("elem1",l.elem1);
r.myDict.Add("elem1",l.elem1);
r.myDict.Add("elem1",l.elem1);
r.myDict.Add("elem1",l.elem1);
result.Add(r);
}
答案 0 :(得分:0)
您可以尝试以下方法:
inputList
.Select(i => new A(){myDict = new Dictionary<string, string>{{"elem1", i.elem1},{"elem2", i.elem2},{"elem3", i.elem3},{"elem4", i.elem4}}})
.ToList();
这要求myDict
是公共领域,但是从您的问题来看,我认为它是(或代码必须在类中)。
此外,我认为您的字段名称错误,因为它们不是唯一的,并且此类代码无法编译,但是我假设名称应为elem1
,elem2
,{{1} },elem3
。
答案 1 :(得分:0)
如果您想为任何类使用通用代码,那么解决此问题的最佳方法是使用ToDictionary
方法和reflection。要使用其值检索所有公共字段,请使用以下代码:
var result = inputList
.Select(item => new A() {
myDict = item
.GetType() // get item's type declaration
.GetFields(BindingFlags.Instance | BindingFlags.Public)) // get all public non static fileds of item's class
.ToDictionary(f => f.Name, f => f.GetValue(item) // get dictionary with field name as the key and field value as the value
})
.ToList();
如果您不仅需要检索公共成员或属性,还可以检索字段,则可以使用class Type
的其他方法。您还可以创建更通用的算法,并使用其字段的特殊属性和GetCustomAttributes
方法仅检索需要的字段。
请注意,myDict
字段必须是公共的。
答案 2 :(得分:0)
易于使用linq,
input ip = new input();
Dictionary<string, string> myDictionary = typeof(input).GetFields(BindingFlags.Instance | BindingFlags.Public).ToDictionary(x => x.Name, x => x.GetValue(ip).ToString());
答案 3 :(得分:0)
Linq 版本可以是这样的(如果您需要简洁的代码):
List<A> result = inputList // For each item in inputList
.Select(item => new A() { // Create A instance
myDict = new Dictionary<string, string>() { // Assign myDict within A by a dictionary
{"elem1", item.elem1}, // Which has 4 items
{"elem2", item.elem2},
{"elem3", item.elem3},
{"elem4", item.elem4},
}
})
.ToList(); // Materialize as a List<A>
可读性是否比原始代码高(或低)?