C# 如何使用LINQ对列表中的项目进行排序和筛选<;退货项目>;收集
这很难解释 我们有一个DataTable,其中包含用户可配置的列选择,这些列在编译时是未知的。DataTable中的每一列都是String类型。我们需要将此DataTable转换为“ReturnItem”对象的强类型集合,这样我们就可以使用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(字符串)和列(列表(对象
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,我想我得到了答案。听起来列作为包含列名和列值的字典可能更好,这样就可以很容易地找出所有所谓的“创建”值。或者,您可以尝试将列表转换为内存中的可查询列表,并查看动态查询库是否可以处理该列表。非常感谢,我们现在正在测试此列表,它会让您知道,有时它会盯着您的脸看!