2012-11-22 40 views
6

Tôi muốn chọn cột động từ List như sau. Vì vậy, những gì có thể là cách tốt nhất?Cách chọn cột động từ Danh sách

//a objects list 
List<DashBoard> dashboardlist = (List<DashBoard>)objList; 
string strColumns = "RecDate,ModifiedDate"; 
objList = (from obj in dashboardlist select new { strColumns }).ToList(); 

///////////// Ok, Chỉ cần quên Danh sách đối tượng nói rằng tôi có bảng cơ sở dữ liệu có số ID cột, Tên, Tuổi, giới tính, vv ..Then tôi có columnList để hiển thị và columnList thay đổi theo điều kiện. SO tôi có liệt kê mọi người; và Danh sách columnTemplate; vì vậy bây giờ tôi muốn chọn cột dựa trên mẫu.

+4

Bạn định sử dụng 'objList' như thế nào? Tôi hy vọng bạn nhận ra nó sẽ không đơn giản để truy cập các thuộc tính như khi bạn định nghĩa tĩnh các cột ('select new {obj.RecDate, obj.ModifiedDate}') mà bạn đang chọn để C# có thể tạo một kiểu ẩn danh cho bạn . Có thể dễ dàng hơn khi tiếp tục sử dụng các đối tượng 'DashBoard' đầy đủ và chỉ đọc các thuộc tính được chỉ định bởi các chuỗi khi cần thiết. –

+0

Tình huống đã đưa ra câu hỏi này là gì? Tôi muốn được đồng ý với Tim S - gắn bó với đối tượng Bảng điều khiển –

+0

Có lý do nào khiến bạn cần trả về một đối tượng ẩn danh hay những gì bạn cần là trả về một 'Danh sách ' với các thuộc tính khác được khởi tạo? –

Trả lời

6

Cảm ơn bạn đã cung cấp ý tưởng cho câu hỏi của tôi.Thêm vài giờ trong Google Tôi tìm thấy solution.

public void Test() { 
    var data = new[] { 
     new TestData { X = 1, Y = 2, Z = 3 } 
    , new TestData { X = 2, Y = 4, Z = 6 } 
    }; 
    var strColumns = "X,Z".Split(','); 
    foreach (var item in data.Select(a => Projection(a, strColumns))) { 
     Console.WriteLine("{0} {1}", item.X, item.Z); 
    } 
} 
private static dynamic Projection(object a, IEnumerable<string> props) { 
    if (a == null) { 
     return null; 
    } 
    IDictionary<string,object> res = new ExpandoObject(); 
    var type = a.GetType(); 
    foreach (var pair in props.Select(n => new { 
     Name = n 
    , Property = type.GetProperty(n)})) { 
     res[pair.Name] = pair.Property.GetValue(a, new object[0]); 
    } 
    return res; 
} 
class TestData { 
    public int X { get; set; } 
    public int Y { get; set; } 
    public int Z { get; set; } 
} 
1

Tôi giả định rằng danh sách các cột có thể đến từ một nguồn bên ngoài và sự thay đổi, tôi đề nghị:

với suy nghĩ bạn có thể tạo ra một danh sách các FieldInfo tương ứng với mỗi cột, sau đó lặp trên mỗi mục trên và mỗi FieldInfo và gọi GetValue trên đối tượng dữ liệu.

0

Hãy cho rằng bạn chỉ có 2 mẫu. Bạn có thể tạo một phương thức cho mỗi mẫu, chỉ trả về các cột bạn cần. Một cái gì đó như thế này:

// method for template 1 - returns only 3 columns/properties 
private DashBoard CreateDashBoardXxxxxxx(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 
     Property3 = item.Property3 
    }; 
} 

// method for template 2 - returns N columns/properties 
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 

     // Other properties 
     // ..... 

     PropertyN = item.PropertyN 
    }; 
} 

Sau đó, bạn có thể sử dụng các phương pháp đó như thế này:

List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1 
var list = dashboardlist.Select(CreateDashBoardXxxxxxx); 

// using template 2 
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy); 

Bạn chỉ cần thực hiện một số mã để quyết định mẫu nên được sử dụng.

Tôi hy vọng điều này sẽ giúp ích !!

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