【问题标题】:Pivot-type scenario with objects in C#C# 中带有对象的枢轴类型场景
【发布时间】:2013-04-18 15:29:59
【问题描述】:
考虑这种情况
我有一个名为 User 的类,其中包含汽车类型列表(例如 Toyota、BMW)
也就是说,一个用户可以拥有许多汽车。
假设我有一个用户类型的列表。在当前的格式中,我可以轻松找到用户拥有的所有汽车。
我不能轻易做到的是找到拥有特定汽车类型的所有用户(例如拥有丰田汽车的所有用户)。
在经典的数据库意义上,我希望能够对数据进行透视,但是在 C# 中使用这样的对象时如何实现这样的操作?
谢谢
托马斯
【问题讨论】:
标签:
c#
database
search
object
pivot
【解决方案1】:
你有一个一对多的关系,所以你可以双向。有车有车,有车有车。请参阅以下 C# 代码:
class Users
{
public string Name { get; set; }
public List<Car> Cars { get; set; }
}
class Car
{
public string Name { get; set; }
}
var users = new List<Users>
{
new Users
{
Name = "Bob",
Cars = new List<Car> { new Car { Name = "Toyota" } }
}
};
// Any Cars with Name "Toyota" in a User's list of cars.
var usersWithCar = users.Where(user => user.Cars.Any(car => car.Name == "Toyota"));
string userName = usersWithCar.Single().Name; // Bob
【解决方案2】:
您应该尝试使用 Linq,首先您需要添加对 System.Linq 的引用(如果尚未完成)
接下来你可以这样做:
List<User> Example = new List<User>();
var Users_Having_A_Renault_ZE = Example.Where(
Me => Me.MyCars.Any(
Car => Car.MyName == "Renault ZE"))
它的意思是“接受所有拥有一辆或多辆名为 Renault ZE 的汽车的用户”
+ 它假定 MyCars 是一个 List、一个数组或类似的东西。
【解决方案3】:
您可以使用 LINQ 来实现这一点。
class Car {}
class Toyota : Car {}
class BMW : Car {}
class User
{
private readonly IList<Car> cars = new List<Car>();
public IList<Car> Cars { get { return cars; } }
public void AddCar(Car car)
{
Cars.Add(car);
}
}
User user1 = new User();
user1.AddCar(new BMW());
user1.AddCar(new Toyota());
User user2 = new User();
user2.AddCar(new BMW());
var users = new List<User>
{
user1,
user2
};
IEnumberable<User> usersWithBMW = users.Where(u => u.Cars.Any(c => c is BMW));