如何在使用LINQ C#创建新对象时访问内部属性?

如何在使用LINQ C#创建新对象时访问内部属性?,c#,properties,model,new-operator,C#,Properties,Model,New Operator,我有一个模型类名person public class person { public string Name { get; set; } public string[] cars { get; set; } public int NoOfCars { get; set; } } 我有一个明显的收集,即个人名单。现在我将初始化ObservableCollection person pItem = new person { Name = "Sakthi",

我有一个模型类名person

public class person
{
    public string Name { get; set; }
    public string[] cars { get; set; }
    public int NoOfCars { get; set; }
}
我有一个明显的收集,即个人名单。现在我将初始化ObservableCollection

person pItem = new person
{
    Name = "Sakthi",
    cars = new string[] { "Honda City", "Maruthi Ciaz" },
    NoOfCars = cars.Count()
}

ObservableCollection<person> PersonsList = new ObservableCollection<person>();
PersonsList.Add(pItem);
person pItem=新人
{
Name=“Sakthi”,
cars=新字符串[]{“Honda City”、“Maruthi Ciaz”},
NoOfCars=cars.Count()
}
ObservableCollection PersonList=新的ObservableCollection();
人员列表。添加(pItem);

在这里,我需要从cars属性中分配NoOfCars,而不需要手动将值指定为2,也不需要显式使用外部字符串[]变量。我需要使用LINQ C隐式内联解决方案。

您可以将逻辑添加到属性本身:

public class Person
{
    public string Name { get; set; }
    public string[] Cars { get; set; }
    public int NoOfCars { get { return Cars == null ? 0 : Cars.Length; } }
}
不需要提供setter

旁注:您应该遵循.NET


如果您无法修改该类,并且需要将其内联(为什么?),则无法从对象初始值设定项中访问其他属性,因为该对象尚未完全初始化。所以这是不允许的

为什么不能将数组存储在变量中

string[] myCars= { "Honda City", "Maruthi Ciaz" };
person pItem = new person
{
    Name = "Sakthi",
    cars = myCars,
    NoOfCars = myCars.Length
}

可以将逻辑添加到属性本身:

public class Person
{
    public string Name { get; set; }
    public string[] Cars { get; set; }
    public int NoOfCars { get { return Cars == null ? 0 : Cars.Length; } }
}
不需要提供setter

旁注:您应该遵循.NET


如果您无法修改该类,并且需要将其内联(为什么?),则无法从对象初始值设定项中访问其他属性,因为该对象尚未完全初始化。所以这是不允许的

为什么不能将数组存储在变量中

string[] myCars= { "Honda City", "Maruthi Ciaz" };
person pItem = new person
{
    Name = "Sakthi",
    cars = myCars,
    NoOfCars = myCars.Length
}

字段初始化是全有或全无操作。要么执行所有操作,要么不执行任何操作,然而,只有当所有操作都完成时,这种包含操作的结果才可见。因此,不能在初始值设定项中使用
cars.Count()
。尤其是
cars
-属性甚至不在初始值设定项的范围内,因此您无法以任何方式访问它

你必须在初始化你的
人之后设置它,或者通过
NoOfCars=pItem.cars.Count()
明确地设置,或者正如Tim在
NoOfCars
的getter中已经提到的那样设置

编辑:如果确实要使用字段初始化,可以在前面创建数组,然后设置
人员

var cars = new string[] { "Honda City", "Maruthi Ciaz" };
person pItem = new person
{
    Name = "Sakthi",
    cars = cars,
    NoOfCars = cars.Count()
}

字段初始化是全有或全无操作。要么执行所有操作,要么不执行任何操作,然而,只有当所有操作都完成时,这种包含操作的结果才可见。因此,不能在初始值设定项中使用
cars.Count()
。尤其是
cars
-属性甚至不在初始值设定项的范围内,因此您无法以任何方式访问它

你必须在初始化你的
人之后设置它,或者通过
NoOfCars=pItem.cars.Count()
明确地设置,或者正如Tim在
NoOfCars
的getter中已经提到的那样设置

编辑:如果确实要使用字段初始化,可以在前面创建数组,然后设置
人员

var cars = new string[] { "Honda City", "Maruthi Ciaz" };
person pItem = new person
{
    Name = "Sakthi",
    cars = cars,
    NoOfCars = cars.Count()
}

如果您的模型类是远程的,请尝试此选项

 person pItem = new person
 {
  Name = "Sakthi",
  cars = new string[] { "Honda City", "Maruthi Ciaz" },
  NoOfCars = 0
 }
在将项目添加到列表之前,计算NoOfCars的值

        ObservableCollection<person> PersonsList = new ObservableCollection<person>();
        pItem.NoOfCars = pItem.cars.Count();
        PersonsList.Add(pItem);
ObservableCollection PersonList=新的ObservableCollection();
pItem.NoOfCars=pItem.cars.Count();
人员列表。添加(pItem);

如果您的模型类是远程的,请尝试此选项

 person pItem = new person
 {
  Name = "Sakthi",
  cars = new string[] { "Honda City", "Maruthi Ciaz" },
  NoOfCars = 0
 }
在将项目添加到列表之前,计算NoOfCars的值

        ObservableCollection<person> PersonsList = new ObservableCollection<person>();
        pItem.NoOfCars = pItem.cars.Count();
        PersonsList.Add(pItem);
ObservableCollection PersonList=新的ObservableCollection();
pItem.NoOfCars=pItem.cars.Count();
人员列表。添加(pItem);

如果不能修改Person类,可以编写一个方法(否则可以给它一个合适的构造函数):

那就叫它:

PersonsList.Add(CreatePerson("Sakthi", new string[] { "Honda City", "Maruthi Ciaz" }));

如果不能修改Person类,可以编写一个方法(否则可以给它一个合适的构造函数):

那就叫它:

PersonsList.Add(CreatePerson("Sakthi", new string[] { "Honda City", "Maruthi Ciaz" }));

谢谢。但是我的模型类在远程服务器中。我无法修改它,或者无法创建派生类。请帮助我。我必须把这个任务放在一个复杂的LINQ中。这是一个单语句执行。所以,我在内联赋值中需要它,而不是使用外部变量的显式赋值。请帮助我。@B.Balamanigandan:将
字符串[]
存储在匿名类型的属性中。然后,您可以使用它初始化对象,并从中派生
NoOfCars
值。但是我们必须看到你真正的疑问来告诉你怎么做。非常感谢。但是我的模型类在远程服务器中。我无法修改它,或者无法创建派生类。请帮助我。我必须把这个任务放在一个复杂的LINQ中。这是一个单语句执行。所以,我在内联赋值中需要它,而不是使用外部变量的显式赋值。请帮助我。@B.Balamanigandan:将
字符串[]
存储在匿名类型的属性中。然后,您可以使用它初始化对象,并从中派生
NoOfCars
值。但我们必须看到您真正的查询,以向您展示如何使用“我需要使用LINQ隐式内联解决方案”为什么?除了只显示一个LINQ没有意义的对象之外,为什么还需要它内联呢?如果我使用(新字符串[]{“Honda City”,“Maruthi Ciaz”})。Count()意味着它会不自觉地消耗内存。这就是我的问题。那你为什么不能使用
2
?如果
字符串[]
已经是静态的,不能作为变量使用。将
字符串[]
存储在匿名类型的属性中。然后,您可以使用它初始化对象,并从中派生
NoOfCars
值。但我们必须看看你真正的查询,告诉你怎么做。我刚刚展示了样本集。它是一个从另一个集合查询的集合,而不是如上所述的静态赋值?除了只显示一个对象之外