【问题标题】:LINQ select new class with a nameLINQ 选择具有名称的新类
【发布时间】:2010-07-25 21:11:53
【问题描述】:

我有一个 linq 查询,我在其中创建了几个具有 Parent 属性的类。我正在寻找一种将父属性设置为我刚刚创建的类的方法。我的解释很糟糕;这是我正在尝试做的代码。

var query = from states in xml.Elements()
                    select new State
                    {
                        Children = from cities in states.Elements()
                                   select new City()
                                    {
                                        ParentState = **???**;
                                    }
                    };

如何设置 ParentState 属性?如果我能做类似的事情

select new State as newState
{
    ...
}

那会很酷,但我不能。我知道我可以使用 foreach 循环来做到这一点,但我想了解如果可能的话,如何使用 LINQ 来做到这一点。帮助:(

编辑:我试过了 let x = new State{ } 但这并没有太大帮助。我希望我可以像这样在构造函数中引用 x 但它没有成功:

let x = new State 
{  
    Children = from cities in states.Elements()
               select new City{ ParentState = x }
}
select x;

在 F# 中,有类似的东西,你可以简单地说 let rec x = ... 然后你可以引用赋值语句中的变量。但这是 C# 而不是 F# 等等。

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    有趣的问题,当然可以通过在查询语句中设置属性来解决,但我认为另一种可能性是将一些逻辑移动到 State 内的构造函数中。考虑以下代码示例

    class State
    {
        public int Id { get; set; }
        public List<City> Children { get; set; }
    
        public State(int id, IEnumerable<City> childrenCities)
        {
            this.Id = id;
            this.Children = childrenCities.ToList();
            foreach (City city in this.Children)
                city.ParentState = this;
        }
    }
    

    这个 State 类有一个构造函数,它接受一个可枚举的 City 对象。然后循环遍历对象并设置 ParentState 属性。

    然后,您无需使用查询表达式设置属性,而是调用构造函数。

    // not LINQ-to-XML, just an example
    var states = from i in Enumerable.Range(0, 10)
                    select new State(
                        i,
                        from j in Enumerable.Range(0, 5)
                        select new City
                        {
                            Id = j
                        }
                    );
    

    【讨论】:

      【解决方案2】:

      嘿,我想这就是你需要的

          var query = from states in xml.Elements()
                              select new State
                              {
                                  Children = from cities in states.Elements()
                                             select new City()
                                              {
                                                  ParentState = new State{
                                                      Property1 = states.XElement("Property1").Value
      }
                                              }
                              };
      

      变量 states 是当前状态。我假设“states” var 是一个 XElement 并保存数据以填充 parentstate 属性

      希望对你有帮助

      【讨论】:

      • 他希望子 City 对象引用父 State 对象。您的方法没有实现这个目标,因为外部 State 和父 State 不是同一个对象。
      • 是的,我现在明白了。确实很有趣的问题:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多