我有3个类的定义如下:
class Customer
{
public string Name;
public string City;
public Order[] Orders;
}
class Order
{
public int Quantity;
public Product Product;
}
class Product
{
public string ProdName;
public decimal Price;
}我想在C#中使用LINQ打印出购买特定产品的名称,在本例中是“ProdName”。我无法找到一个解决方案,通过所有这三个类,可以给我基于产品名称的名称。
我试过这样的方法,但似乎行不通:
var query = from c in customers where c.Order[0].Product.ProdName.Contains("Milk")
select c.Name;
foreach(var item in query)
{
Console.WriteLine(item);
}我是这样为每个类设置值的:
static public List<Customer> GetCustomerList()
{
var customerList = new List<Customer>
{
new Customer {Name = "Johny", City = "London", Orders = new Order[3] },
new Customer {Name = "Morgan", City = "Copenhagen", Orders = new Order[4]},
new Customer {Name = "Rasmus", City = "Amsterdam", Orders = new Order[1] }
};
return customerList;
}
static public List<Order> GetOrderList()
{
var orderList = new List<Order>
{
new Order { Quantity = 10, Product = new Product()},
new Order { Quantity = 5, Product = new Product()},
new Order { Quantity = 2, Product = new Product()}
};
return orderList;
}
static public List<Product> GetProductList()
{
var productList = new List<Product>
{
new Product { Name = "Cookie, bread", Price = 50 },
new Product { Name = "Cookie, Bread, Milk", Price = 85},
new Product { Name = "bags", Price = 38}
};
return productList;
}
static void Main(string[] args)
{
List<Customer> customers = GetCustomerList();
List<Order> orders = GetOrderList();
List<Product> products = GetProductList();
}为了得到正确的结果,我如何将所有三个类结合在一起?有什么提示吗?
发布于 2015-09-22 17:01:59
您需要构建真实的、相关的测试数据。一些可用的假数据设置可能如下所示:
// Create a single instance of each Product that could be used
var egg = new Product { Name = "Eggs", Price = 2.0 };
var bread = new Product { Name = "Bread", Price = 3.0 };
var fooBars = new Product { Name = "FooBars", Price = 2.5 };
var customerList = new List<Customer>
{
new Customer { Name = "Johny", City = "London", Orders = new List<Order>
{
new Order { Quantity = 3, Product = bread },
new Order { Quantity = 1, Product = egg },
new Order { Quantity = 2, Product = fooBars }
}},
new Customer { Name = "Morgan", City = "Copenhagen", Orders = new List<Order>
{
new Order { Quantity = 30, Product = bread }
}},
new Customer { Name = "Rasmus", City = "Amsterdam", Orders = new List<Order>
{
new Order { Quantity = 12, Product = fooBars }
}}
};请注意,我使用的是List<Order>而不是Order[],但是您可以将它切换回来。我还选择了在Name中使用Product属性,正如您在示例代码中显示的那样,但它与类定义不匹配。
现在你可以查询了。让我们看看谁买了面包
var whoBoughtBread = customerList
.Where(c => c.Orders.Any(o => o.Product == bread))
.Select(c => c.Name);或
var whoBoughtBread2 = customerList
.Where(c => c.Orders.Any(o => o.Product.Name == "Bread"))
.Select(c => c.Name);发布于 2015-09-22 17:03:23
对于数据结构,有一个查询是:
customerList.Where(c => c.Orders.Any(o => o.Product.ProdName == prodName));但是,正如注释中提到的,您在集合中具有null集合和null值的潜力。我强烈建议确保具有非空元素的非空集合,以避免向查询中注入空检查。否则你就得做点什么,比如:
customerList.Where(c => c.Orders != null &&
c.Orders.Any(o => o != null &&
o.Product != null &&
o.Product.ProdName == prodName));使用C# 6的空传播运算符(?.),您可以将它缩短一些。
customerList.Where(c => c.Orders != null &&
c.Orders.Any(o => o?.Product != null &&
o.Product.ProdName == prodName));https://stackoverflow.com/questions/32722539
复制相似问题