2017-09-18 61 views
9

Tôi có hai lớp này trong mã của tôi và Danh sách Class2. Tôi muốn nhóm các phần tử danh sách theo dateID bằng LINQ.Cần trợ giúp trong việc nhóm bằng LINQ trong C#

public class Class1 
{ 
    public string ID; 
    public int y; 
    public int z; 
} 

public class Class2 
{ 
    public List<Class1> a; 
    public int p, q; 
    public string s; 
    public DateTime date; 
} 

danh sách của tôi là tương tự như sau:

List<Class2> object1 = new List<Class2> 
{ 
    new Class2 {p = 5, q = 6, date = DateTime.Now, a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } }, 
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(1), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } }, 
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(2), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } }, 
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(3), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } }, 
}; 

Xin lỗi nếu điều này là một câu hỏi ngu ngốc, nhưng tôi là một người mới bắt đầu trong lập trình C# và LINQ và tôi không chắc chắn nếu điều này thậm chí còn có thể.

Đây là những gì tôi đã cố gắng dựa trên ví dụ tôi thấy trên web, nhưng nó không đúng

var newList = from item in object1 
       group new 
       { 
        item.s, 
        item.a[0].x, //I think its wrong because of this 
        item.a[0].y //and this 
       } 
       by new 
       { 
        item.date, 
        item.a[0].ID //and this 
       } 
       into temp 
       select temp; 

Kể từ khi tôi đã hardcoded chỉ số 0 trong nhóm tôi đang thiếu rất nhiều yếu tố trong danh sách cuối cùng của tôi. Làm cách nào để tôi thực hiện việc này cho tất cả các thành phần trong danh sách a trong Class2?

sản lượng dự kiến ​​là tương tự như sau:

Key: {date: 19-09-2017 ID: 3643746HDJ}, Element: {{s: "abc", y = 1, z = 2}, {s: "pqr", y = 2, z = 4}, {s: "abc", y = 1, z = 2}} 
Key: {date: 20-09-2017 ID: 3643746HDJ}, Element: {{s: "pop", y = 1, z = 2}, {s: "dfr", y = 2, z = 4}, {s: "abc", y = 1, z = 2}} 
Key: {date: 19-09-2017 ID: 746327846HDJ}, Element: {{s: "abc", y = 7, z = 8}, {s: "asar", y = 2, z = 111}, {s: "abc", y = 1, z = 2}} 
Key: {date: 20-09-2017 ID: 746327846HDJ}, Element: {{s: "abc", y = 7, z = 8}, {s: "asar", y = 2, z = 111}, {s: "abc", y = 1, z = 2}} 
+1

Lớp học của bạn có thực sự trông như thế không? Giống như bạn đang sử dụng các trường công cộng thay vì các thuộc tính? – maccettura

+5

Bạn có thể hiển thị kết quả mong đợi không? – Fabio

+0

Yếu tố 'Danh sách' nào? Làm thế nào để bạn mong đợi để nhóm bằng 'ID' khi bạn có nhiều' ID 'trong' Danh sách a'? – NetMage

Trả lời

3

bang Câu hỏi của bạn:

Kể từ khi tôi đã hardcoded chỉ số 0 trong nhóm tôi thiếu rất nhiều yếu tố trong danh sách cuối cùng của tôi . Làm thế nào tôi có thể làm điều này cho tất cả các phần tử của danh sách a trong Class2?

Vì bạn muốn tất cả các mục từ bộ sưu tập lồng nhau, bạn cần phải làm phẳng bộ sưu tập lồng nhau trước khi nhóm. Trong cú pháp truy vấn làm như vậy sử dụng một from:

var result = from item in object1 
      from nested in item.a 
      group new { item.s, nested.y, nested.z } by new { item.date, nested.ID } into g 
      select g; 

Như từng đối tượng lồng nhau không có một pq tính nhưng mã của bạn cho thấy việc tiếp cận các mục lồng nhau tôi đã sử dụng yz thay

này có thể cũng được thực hiện bằng cách sử dụng cú pháp phương thức. Để làm phẳng các bộ sưu tập lồng nhau, hãy sử dụng SelectMany. Đối với GroupBy, bạn có thể sử dụng quá tải nơi bạn chỉ định cả bộ chọn khóa và phần tử. ý tưởng chung cho rằng:

var result = object1.SelectMany(item => item.a.Select(nested => new {item, nested })) 
        .GroupBy(key => new { key.item.Date, key.nested.Id }, 
          val => new { val.item.s, val.nested.x, val.nestd.y }); 

Mặc dù có vẻ như nó chỉ dành cho mục đích câu hỏi duy nhất tôi khuyên bạn nên đặt những cái tên có ý nghĩa đối với tài sản và các biến và để có một cái nhìn tại địa chỉ:

+0

Tuyệt vời! Điều này thực hiện chính xác những gì tôi muốn. Cảm ơn bạn đã trợ giúp và cho các liên kết này. Tôi sẽ bắt đầu theo các quy ước này từ bây giờ. – Anon

+1

@Anon - bạn được chào đón :) hạnh phúc tôi có thể giúp –

Các vấn đề liên quan