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;
}

RestaurantData に含まれるデータを DataGridView コントロールに表示したいと思います。まず、レストランの ID を表示し、続いてレストランに対する苦情の数を次のように表示します (ID は列 A、名前は列 B など)。

ID1、名前、住所、年齢、日付
(スペース)、名前、住所、年齢、日付
(スペース)、名前、住所、年齢、日付
ID2、名前、住所、年齢、日付
(スペース)、名前、住所、年齢、日付
(スペース)、名前、住所、年齢、日付

すべてのレストランには少なくとも 1 件の苦情があり、一部のレストランには多くの苦情がある場合があります。しかし、すべての場合において、レストランの ID は 1 回だけ表示されるようにしたいと考えています (その後に苦情が表示されます)。私の過去の DataGridView の使用は、dataGridView1.DataSource = (一部の配列) に限定されていました。ただ、今回紹介したい情報は明らかに配列ではないので行き詰まっています。

 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 が 1 回だけ表示されるように上記のクエリを調整するにはどうすればよいですか?

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 に答える