2014-09-07 2 views
1

Как использовать LINQ для создания объекта, а также инициализировать список внутри этого объекта? (Кроме того, я пытаюсь создать неизменяемый объект.) Я обращаюсь к веб-службе XML.LINQ to Objects - Инициализирующие списки

Например, у меня есть класс с несколькими свойствами. Однако у меня также есть некоторые частные списки в классе.

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 и создать «MyClass» объект, а затем установить его свойства через конструктор. Тем не менее, я не знаю, как либо:

  • Инициализирует List<Result> внутри запроса LINQ
  • Как изменить свойство Result в списке внутри запроса LINQ

Это 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") 
          ) 

Мой вопрос: я не знаю достаточно о LI NQ или создавать объекты с LINQ, чтобы знать, как инициализировать списки в объекте, который я пытаюсь создать. Как мне это сделать? Как добавить элементы в ResultSet1 из LINQ?

ответ

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 = ... 
         }; 

хотя это становится довольно противно, и может сделать это трудно отлаживать вниз по дороге. Как насчет конструктора, который взял узел и разобрал его?

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. */, 
    }; 
+0

Мне нравится это больше, чем мое, это более читаемо – Jonesopolis