代码之家  ›  专栏  ›  技术社区  ›  Daniel McPherson

如何使用Linq对List<ReturnItem>集合中的项目进行排序和筛选?

  •  4
  • Daniel McPherson  · 技术社区  · 16 年前

    这很难解释。

    我们有一个数据表,其中包含用户可配置的列选择,这些列在编译时是未知的。数据表中的每一列都是string类型。我们需要将这个数据表转换成一个“returnItem”对象的强类型集合,这样我们就可以使用LINQ对应用程序中使用的对象进行排序和筛选。

    我们取得了如下进展:

    1. 我们从基本数据表开始。
    2. 然后我们处理数据表,为每一行创建一个新的“returnItem”对象。
    3. 这个“返回项”对象只有两个属性:ID(字符串)和列(列表(对象))。属性集合为每列包含一个条目,表示一个数据行。
    4. 每个属性都是强类型的(int、string、datetime等)。例如,它会将一个新的“datetime”对象添加到包含“created”数据表列值的“returnitem”列列表中。
    5. 结果是一个列表(返回项),我们希望能够使用Linq根据其中一个属性中的值进行排序和筛选,例如,根据“已创建”日期进行排序。

    我们一直在使用Linq动态查询库,这让我们了解了很多,但它看起来不像是前进的方向,因为我们在对象列表集合上使用它。

    基本上,我的问题可以归结为:如何使用Linq,根据作为ReturnItem类一部分的List(Object)属性中的值,对List(ReturnItem)集合中的项进行排序和筛选?

    2 回复  |  直到 8 年前
        1
  •  3
  •   fearofawhackplanet    16 年前

    我不确定我是否理解问题所在。假设您知道要排序的列的索引,并且它们是非常普通的类型,那么您就不能这样做吗?

    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;
    }
    
        2
  •  0
  •   Mauro    16 年前

    测试这个。

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