如何使用LINQ,对List <returnitem>集合中的项目进行排序和过滤?</returnitem>

时间:2010-05-06 10:32:23

标签: c# linq collections linq-to-objects

这很难解释。

我们有一个DataTable,它包含用户可配置的列选择,这些列在编译时是未知的。 DataTable中的每一列都是String类型。我们需要将此DataTable转换为强类型的“ReturnItem”对象集合,以便我们可以使用LINQ对我们的应用程序进行排序和过滤。

我们取得了一些进展如下:

  1. 我们从基本的DataTable开始。
  2. 然后我们处理DataTable,为每一行创建一个新的“ReturnItem”对象
  3. 此“ReturnItem”对象只有两个属性:ID(字符串)和列(List(对象))。 properties集合包含每列的一个条目,表示单个DataRow。
  4. 每个属性都是Strongly Typed(int,string,datetime等)。例如,它会向“ReturnItem”列列表添加一个新的“DateTime”对象,其中包含“Created”Datatable Column的值。
  5. 结果是一个List(ReturnItem),我们希望能够根据其中一个属性中的值使用LINQ对其进行排序和过滤,例如,对“创建”日期进行排序。
  6. 我们一直在使用LINQ动态查询库,它让我们到目前为止,但它看起来不像前进的道路,因为我们在列表对象集合中使用它。

    基本上,我的问题归结为:我如何使用LINQ,根据作为ReturnItem类的一部分的List(object)属性中的值对List(ReturnItem)集合中的项进行排序和过滤? / p>

2 个答案:

答案 0 :(得分:3)

我不确定我是否理解问题所在。假设您知道要排序的列的索引并且它们是相当简单的类型,那么您不能只做类似的事情......

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

答案 1 :(得分:0)

测试一下。

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