Как использовать LINQ для сортировки и фильтрации элементов в коллекции List <ReturnItem>? - PullRequest
4 голосов
/ 06 мая 2010

Это сложно объяснить.

У нас есть DataTable, который содержит настраиваемый пользователем выбор столбцов, которые не известны во время компиляции.Каждый столбец в DataTable имеет тип String.Нам нужно преобразовать этот DataTable в строго типизированную коллекцию объектов «ReturnItem», чтобы мы могли затем сортировать и фильтровать, используя LINQ для использования в нашем приложении.

Мы добились некоторого прогресса следующим образом:

  1. Мы начали с базового DataTable.
  2. Затем мы обрабатываем DataTable, создавая новый объект «ReturnItem» для каждой строки
  3. Этот объект «ReturnItem» имеет только два свойства:ID (строка) и столбцы (список (объект)).Коллекция свойств содержит одну запись для каждого столбца, представляющую один DataRow.
  4. Каждое свойство имеет строго типизированный тип (int, string, datetime и т. Д.).Например, он добавил бы новый объект «DateTime» в список столбцов «ReturnItem», содержащий значение столбца данных «Создано».
  5. В результате получается список (ReturnItem), который мы затем хотели бы иметь возможность сортировать и фильтровать с помощью LINQ на основе значения в одном из свойств, например, сортировать по дате «Создано».

Мы использовали динамическую библиотеку запросов LINQ, которая нам пока далеко, но это не похоже на путь вперед, потому что мы используем ее над списком объектов List.

По сути, мой вопрос сводится к следующему: Как я могу использовать LINQ для сортировки и фильтрации элементов в коллекции List (ReturnItem) на основе значений в свойстве List (object), которое является частью класса ReturnItem?

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

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

void Main()
{
    List<ReturnItem> items = new List<ReturnItem>();
    items.Add(new ReturnItem() 
              { 
                    ID = 1, 
                    Columns = new List<object>() 
                    {
                        DateTime.Now,
                        "donkey"
                    }
               });

    items.Add(new ReturnItem() 
              { 
                    ID = 2, 
                    Columns = new List<object>() 
                    {
                        DateTime.Now.AddHours(3),
                        "baboon"
                    }
               });

    items.Add(new ReturnItem() 
              { 
                    ID = 3, 
                    Columns = new List<object>() 
                    {
                        DateTime.Now.AddHours(2),
                        "antelope"
                    }
               });


    IEnumerable<ReturnItem> sortedByDate =
        items.OrderBy(x => x.Columns[0]);

    IEnumerable<ReturnItem> sortedByAnimal =
        items.OrderBy(x => x.Columns[1]);

    IEnumerable<ReturnItem> filteredByBaboon =
            items.Where(x => x.Columns[1] == "baboon");
}


public class ReturnItem
{
    public int ID;
    public List<object> Columns;
}
0 голосов
/ 06 мая 2010

Проверьте это.

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

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<ReturnItem> list = new List<ReturnItem>();
            list.Add(new ReturnItem(1, "mouse", DateTime.Now));
            list.Add(new ReturnItem(2, "mickey",DateTime.Now));

            list = list.OrderBy(i => i._column._name).ToList();

            list.ForEach(i => Console.WriteLine(i._column._name));
            Console.Read();
        }
    }

    class ReturnItem
    {
        public int _id;
        public Columns _column;


        public ReturnItem(int id, string name, DateTime date)
        {
            _id = id;
            _column = new Columns(name, date);

        }
    }

    class Columns
    {
        public string _name;
        public DateTime _date;

        public Columns(string name, DateTime date)
        {
            _name = name;
            _date = date;
        }
    }
}
...