2

这是我的代码:

void Main() {
    List<Restaurant> RestaurantData = new List<Restaurant>();
}

class Restaurant {
    public int Id;
    public List<Complaint> Complaints = new List<Complaints>();
}

class Complaint {
    public string Name;
    public string Address;
    public int Age;
    public DateTime ComplaintDate;
}

我想在 DataGridView 控件中显示 RestaurantData 中包含的数据。首先,我想显示餐厅的 ID,然后是针对餐厅的投诉数量,使其看起来像这样(ID 在 A 列,名称在 B 列,依此类推):

ID1、姓名、地址、年龄、日期
(空格)、姓名、地址、年龄、日期
(空格)、姓名、地址、年龄、日期
ID2、姓名、地址、年龄、日期
(空格)、姓名、地址、年龄、日期
(空格)、姓名、地址、年龄、日期

每家餐厅至少有1个投诉,有些餐厅可能会有很多投诉。但在所有情况下,我都希望餐厅的 ID 只显示一次(随之而来的投诉)。我过去对 DataGridView 的使用仅限于 dataGridView1.DataSource = (some array)。但是,这次我要呈现的信息显然不是数组,所以我被卡住了。

 var ds = (from r in RestaurantData
           from c in RestaurantData.Complaint
           select new {Id = r.Id, Address =c.Address, Age = c.Age, Name = c.Name, Date = c.ComplaintDate}
             ).ToList();

    dataGridView1.DataSource = ds;

目前,这会用相应的餐厅 ID 填充每一行。如何调整上述查询以使餐厅 ID 只显示一次?

4

1 回答 1

2

你快到。您几乎完全拥有您想要的东西,并且正在适当的庄园中得到它,但您真正需要知道的是特定投诉是否是该列表中的第一项。Select获得它的方法是在选择时使用complaints具有索引作为参数的重载。要做到这一点,您需要使用方法语法,而不是查询语法,这样就可以解释大部分更改。

一旦你有了那个索引调整ID是一个非常微不足道的检查。

var data = restaurantData.SelectMany(restaurant =>
    restaurant.Complaints.Select((complaint, index) => new
    {
        ID = index == 0 ? restaurant.Id.ToString() : "",
        complaint.Name,
        complaint.Address,
        complaint.Age,
        Date = complaint.ComplaintDate,
    }));
于 2013-10-02T16:04:05.170 回答