2013-11-28 3 views
0

Предположим, что у меня есть этот Список сотрудников, представляющих таблицу сотрудников.Показать только выбранные столбцы

public class Employee 
    { 
     public string Name { get; set; } 
     public string Department { get; set; } 
     public string Function { get; set; } 
     public decimal Salary { get; set; } 
     public DateTime EntryDate { get; set; } 



     public static List<Employee> GetEmployeesList() 
     { 
      return new List<Employee>() { 
        new Employee() { EntryDate = new DateTime(2011, 05, 01), Name = "Fons", Department = "Finance", Function = "Trader", Salary = 6500 }, 
        new Employee() { EntryDate = new DateTime(2013, 05, 02), Name = "Mary", Department = "Finance", Function = "BusinessAnalyst", Salary = 2500 }, 
        new Employee() { EntryDate = new DateTime(2012, 04, 03), Name = "Alex", Department = "Finance", Function = "Trader", Salary = 2100 }, 
        new Employee() { EntryDate = new DateTime(2013, 05, 04), Name = "Jim", Department = "R&D", Function = "Trainer", Salary = 3300 }, 
        new Employee() { EntryDate = new DateTime(2010, 06, 05), Name = "Ellen", Department = "Dev", Function = "Developer", Salary = 2500 }, 
        new Employee() { EntryDate = new DateTime(2000, 09, 06), Name = "Mike", Department = "Dev", Function = "Consultant", Salary = 5100 }, 
        new Employee() { EntryDate = new DateTime(1999, 03, 07), Name = "Jack", Department = "R&D", Function = "Developer", Salary = 6100 }, 
        new Employee() { EntryDate = new DateTime(1989, 01, 08), Name = "Demy", Department = "Dev", Function = "Consultant", Salary = 3300 }}; 
     } 
    } 

Я хочу, чтобы иметь возможность выбирать только нужные столбцы для отображения. как коснуться:

public static List<Employee> SelectColumnsFromTable(List<Employee> employees, int[] selectedColumns) 
    { 
     // only select colums 1, 3 and 4    
    } 

Я видел, что это возможно с SQL и GridView, но в моем случае, результат будет напечатан на консоли. Возможно ли использование C# и Linq?

ответ

1

Как я понимаю, важно выбрать конкретные свойства класса на основе их индекса. Если соответствующие индексы предоставляются вам пользователем, вы можете использовать отражение для динамического доступа к свойствам. Ключевыми моментами являются Type.GetProperties и PropertyInfo.GetValue. Я собрал небольшую sample, чтобы продемонстрировать:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Employee 
{ 
    public int Id {get; set;} 
    public string FirstName { get; set;} 
    public string LastName {get; set;} 
} 

public class Test 
{ 
    private static string[] GetColumnValues(Employee emp, params int[] cols) 
    { 
     var props = emp.GetType().GetProperties(); 
     var values = new List<string>(); 
     foreach(var i in cols) 
     { 
      if (i >= 0 && i < props.Length) 
      { 
       object value = props[i].GetValue(emp, null); 
       values.Add(value == null ? string.Empty : value.ToString()); 
      } 
     } 
     return values.ToArray(); 
    } 
    public static void Main() 
    { 
     var emp = new Employee() { Id = 1, FirstName = "John", LastName = "Smith" }; 
     var values = GetColumnValues(emp, 0, 2); 
     Console.WriteLine(string.Join("\t", values)); 
    } 
} 

Пожалуйста, обратите внимание, что ссылки на свойства от их индекса не может быть очень детерминированным от вас изменить реализацию позже. Поэтому выбор по названию свойства может быть более стабильным. Кроме того, функция селектора столбцов GetColumnValues ​​не возвращает Employees, а значения как строковый массив, поэтому вы можете использовать его в String.Join. Вы можете использовать эту функцию в Linq:

var rows = from x in listOfEmps select GetColumnValues(x, 0, 2); 
foreach(var row in rows) 
    Console.WriteLine(string.Join("\t", row)); 
0
var items = (from i in v.db.DatabaseName 
      orderby i.EmpID descending 
      select new {i.Name, i.Function,i.Salary}).ToList(); 
0
var list = dt.AsEnumerable() 
      .Where(row => (int)row["demoid"] > 5)//your condition here 
      .Select(row => new 
       { 
       demoid = Convert.ToInt32(row["demoid"]), 
       demoname = row["demoname"] != null ? 
          row["demoname"].ToString() : 
          String.Empty 
       }).ToList(); 

Или вы можете определить класс:

public class myClass 
{ 
    public int demoid; 
    public string demoname; 
} 

, а затем:

List<myClass> list = dt.AsEnumerable() 
      .Where(row => (int)row["demoid"] > 5) 
      .Select(row => new myClass 
      { 
       demoid = Convert.ToInt32(row["demoid"]), 
       demoname = row["demoname"] != null ? 
          row["demoname"].ToString() : 
          String.Empty 
      }).ToList<myClass>(); 

это выбор конкретного значения в списке. Однако вы можете использовать IList<myClass> classcollection= new List<myClass>();, а затем добавить конкретный список в класс1 на основе условия.

Примечание: здесь коллекция классов может содержать несколько списков, так как вам нужны столбцы 1,3,4

Смежные вопросы