C# 如何使用LINQ对列表中的项目进行排序和筛选<;退货项目>;收集

C# 如何使用LINQ对列表中的项目进行排序和筛选<;退货项目>;收集,c#,linq,collections,linq-to-objects,C#,Linq,Collections,Linq To Objects,这很难解释 我们有一个DataTable,其中包含用户可配置的列选择,这些列在编译时是未知的。DataTable中的每一列都是String类型。我们需要将此DataTable转换为“ReturnItem”对象的强类型集合,这样我们就可以使用LINQ进行排序和筛选,以便在应用程序中使用 我们在以下方面取得了一些进展: 我们从基本数据表开始 然后,我们处理DataTable,为每一行创建一个新的“ReturnItem”对象 这个“ReturnItem”对象只有两个属性:ID(字符串)和列(列表(对象

这很难解释

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

我们在以下方面取得了一些进展:

  • 我们从基本数据表开始
  • 然后,我们处理DataTable,为每一行创建一个新的“ReturnItem”对象
  • 这个“ReturnItem”对象只有两个属性:ID(字符串)和列(列表(对象))。properties集合为每列包含一个条目,表示一个DataRow
  • 每个属性都是强类型的(int、string、datetime等)。例如,它会将一个新的“DateTime”对象添加到包含“Created”Datatable列值的“ReturnItem”列列表中
  • 结果是一个列表(ReturnItem),我们希望能够根据其中一个属性中的值使用LINQ进行排序和筛选,例如,在“创建”日期排序
  • 到目前为止,我们一直在使用LINQ动态查询库,但它看起来不像是前进的方向,因为我们在对象的列表集合上使用它

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

    测试这一点

    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;
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    命名空间控制台应用程序2
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    列表=新列表();
    添加(新的返回项(1,“鼠标”,DateTime.Now));
    添加(新的返回项(2,“mickey”,DateTime.Now));
    list=list.OrderBy(i=>i.\u column.\u name).ToList();
    list.ForEach(i=>Console.WriteLine(i.\u column.\u name));
    Console.Read();
    }
    }
    类返回项
    {
    公共国际标识;
    公共栏目(u栏目),;
    public ReturnItem(int-id、字符串名称、日期时间)
    {
    _id=id;
    _列=新列(名称、日期);
    }
    }
    类列
    {
    公共字符串\u名称;
    公共日期时间(public DateTime)日期;;
    公共列(字符串名称、日期时间和日期)
    {
    _名称=名称;
    _日期=日期;
    }
    }
    }
    
    我不确定自己是否理解问题所在。假设您知道要排序的列的索引,并且它们是相当普通的类型,您就不能执行以下操作

    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;
    }
    
    void Main()
    {
    列表项=新列表();
    items.Add(新的ReturnItem()
    { 
    ID=1,
    列=新列表()
    {
    日期时间,现在,
    “驴子”
    }
    });
    items.Add(新的ReturnItem()
    { 
    ID=2,
    列=新列表()
    {
    DateTime.Now.AddHours(3),
    “狒狒”
    }
    });
    items.Add(新的ReturnItem()
    { 
    ID=3,
    列=新列表()
    {
    DateTime.Now.AddHours(2),
    “羚羊”
    }
    });
    IEnumerable sortedByDate=
    items.OrderBy(x=>x.Columns[0]);
    IEnumerable分类比亚尼马尔=
    items.OrderBy(x=>x.Columns[1]);
    IEnumerable FiltereBaboon=
    其中(x=>x.Columns[1]==“baboon”);
    }
    公共类返回项
    {
    公共int ID;
    公共列表列;
    }
    
    对于过滤,只需使用:list=list.Where(i=>i.。\u column.\u name==“mickey”).ToList();谢谢,但我不太明白这是如何解决问题的。我想按列的值排序,而不是按列的名称排序。名字并不重要,只是其中的信息。如果你能发布结构,它会更容易帮助你。看一看重新编辑的代码。谢谢Mauro,我想我得到了答案。听起来列作为包含列名和列值的字典可能更好,这样就可以很容易地找出所有所谓的“创建”值。或者,您可以尝试将列表转换为内存中的可查询列表,并查看动态查询库是否可以处理该列表。非常感谢,我们现在正在测试此列表,它会让您知道,有时它会盯着您的脸看!