使用LINQ将类的字段复制到词典列表中

时间:2019-01-15 12:50:26

标签: c# linq

如果问题标题令人困惑,请提前道歉。我将尝试通过一个示例进行解释,希望它会很清楚。

我有一个像下面这样的课程:

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);
}

4 个答案:

答案 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是公共领域,但是从您的问题来看,我认为它是(或代码必须在类中)。

此外,我认为您的字段名称错误,因为它们不是唯一的,并且此类代码无法编译,但是我假设名称应为elem1elem2,{{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>

可读性是否比原始代码高(或低)?