LINQ to Objects - 初始化列表

时间:2014-09-07 01:25:27

标签: c# linq

如何使用LINQ创建对象并初始化该对象中的列表? (另外,我试图创建一个不可变对象。)我正在访问XML Web服务。

例如,我有一个包含多个属性的类。但是,我在课堂上也有一些私人名单。

public class MyClass
{
    public string SomeProperty { get; private set; }
    public string AnotherProperty { get; private set; }

    internal List<Result> ResultSet1 { get; set; }
    internal List<Result> ResultSet2 { get; set; }

    public IEnumerable<Result> GetResultSet1()
    {
        return ResultSet1;
    }

    //Constructor here to set the private properties eg: this.SomeProperty = someProperty;

    //etc.
}

然后我有Result.cs

public class Result
{
    public string YetAnotherProperty { get; private set; }
    //etc.
}

到目前为止,我能够使用LINQ来读取XML并创建一个&#34; MyClass&#34;对象,然后通过构造函数设置它的属性。但是,我不知道如何:

  • 从LINQ查询
  • 中初始化List<Result>
  • 如何在LINQ查询
  • 中更改列表中Result的属性

这是我到目前为止的LINQ:

//Use the contents of XML nodes/elements as the arguments for the constructor:
var query = from i in document.Descendants("response")
                           select new MyClass
                           (
                               (string)i.Element("some").Element("property"),
                               (string)i.Element("another").Element("property")
                           )

我的问题:我不太了解LINQ或使用LINQ创建对象,以了解如何初始化我正在尝试创建的对象中的列表。我该怎么做呢?如何从LINQ中向ResultSet1添加项目?

2 个答案:

答案 0 :(得分:3)

假设可以访问属性,您只需通过常规对象初始化程序语法设置属性即可。只需在new来电后添​​加一对括号,然后设置属性。

var query =
    from response in document.Descendants("response")
    // for readability
    let someProperty = (string)response.Element("some").Element("property")
    let anotherProperty = (string)response.Element("another").Element("property")
    select new MyClass(someProperty, anotherProperty)
    {
        ResultSet1 = response.Elements("someSet")
            .Select(ss => new Result
            {
                YetAnotherProperty = (string)ss.Element("another")
                                               .Element("property")
            })
            .ToList()
        ResultSet2 = /* etc. */,
    };

答案 1 :(得分:1)

在调用构造函数后添加对象初始值设定项:

var query = from i in document.Descendants("response")
                       select new MyClass
                       (
                           (string)i.Element("some").Element("property"),
                           (string)i.Element("another").Element("property")
                       )
                       {
                           ResultSet1 = new List<Result>
                                  {
                                      new Result { YetAnotherProperty = ... },
                                      new Result { ... }            
                                  },
                           ResultSet 2 = ...
                       };
虽然这变得非常讨厌,并且可能很难在路上进行调试。接受节点并将其解析出来的构造函数怎么样?