首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要帮助查询三个类

需要帮助查询三个类
EN

Stack Overflow用户
提问于 2015-09-22 16:54:06
回答 2查看 71关注 0票数 1

我有3个类的定义如下:

代码语言:javascript
运行
复制
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”。我无法找到一个解决方案,通过所有这三个类,可以给我基于产品名称的名称。

我试过这样的方法,但似乎行不通:

代码语言:javascript
运行
复制
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);
}

我是这样为每个类设置值的:

代码语言:javascript
运行
复制
 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();
}

为了得到正确的结果,我如何将所有三个类结合在一起?有什么提示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-22 17:01:59

您需要构建真实的、相关的测试数据。一些可用的假数据设置可能如下所示:

代码语言:javascript
运行
复制
// 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属性,正如您在示例代码中显示的那样,但它与类定义不匹配。

现在你可以查询了。让我们看看谁买了面包

代码语言:javascript
运行
复制
var whoBoughtBread = customerList
    .Where(c => c.Orders.Any(o => o.Product == bread))
    .Select(c => c.Name);

代码语言:javascript
运行
复制
var whoBoughtBread2 = customerList
    .Where(c => c.Orders.Any(o => o.Product.Name == "Bread"))
    .Select(c => c.Name);
票数 1
EN

Stack Overflow用户

发布于 2015-09-22 17:03:23

对于数据结构,有一个查询是:

代码语言:javascript
运行
复制
customerList.Where(c => c.Orders.Any(o => o.Product.ProdName == prodName));

但是,正如注释中提到的,您在集合中具有null集合和null值的潜力。我强烈建议确保具有非空元素的非空集合,以避免向查询中注入空检查。否则你就得做点什么,比如:

代码语言:javascript
运行
复制
customerList.Where(c => c.Orders != null &&
                        c.Orders.Any(o => o != null &&
                                          o.Product != null &&
                                          o.Product.ProdName == prodName));

使用C# 6的空传播运算符(?.),您可以将它缩短一些。

代码语言:javascript
运行
复制
customerList.Where(c => c.Orders != null &&
                        c.Orders.Any(o => o?.Product != null &&
                                          o.Product.ProdName == prodName));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32722539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档