C# 使用LINQ将IEnumerable转换为IList以使用不同日期填充ListView适配器
我正在尝试用唯一的日期填充我的ListView适配器。我正在尝试使用LINQ从数据库中提取不同的日期。注意:对象“tasks”声明为IList 样本数据:C# 使用LINQ将IEnumerable转换为IList以使用不同日期填充ListView适配器,c#,xamarin,C#,Xamarin,我正在尝试用唯一的日期填充我的ListView适配器。我正在尝试使用LINQ从数据库中提取不同的日期。注意:对象“tasks”声明为IList 样本数据: ID | Date | Task 1 4/10/2015 A 2 4/10/2015 B 3 4/9/2015 B 输出: Date 4/10/2015 4/9/2015 这是我的密码: protected override void OnResume (
ID | Date | Task
1 4/10/2015 A
2 4/10/2015 B
3 4/9/2015 B
输出:
Date
4/10/2015
4/9/2015
这是我的密码:
protected override void OnResume ()
{
base.OnResume ();
tasks = TaskManager.GetTasks ().GroupBy(x=> x.Created_date).Distinct();
// create our adapter
taskList = new Adapters.TaskListAdapter(this, tasks);
//Hook up our adapter to our ListView
taskListView.Adapter = taskList;
}
public class TaskListAdapter : BaseAdapter<Task> {
Activity context = null;
IList<Task> tasks = new List<Task>();
public TaskListAdapter (Activity context, IList<Task> tasks) : base ()
{
this.context = context;
this.tasks = tasks;
}
恢复时受保护的覆盖无效()
{
base.OnResume();
tasks=TaskManager.GetTasks().GroupBy(x=>x.Created_date).Distinct();
//创建我们的适配器
taskList=新适配器。TaskListAdapter(此,任务);
//将适配器连接到ListView
taskListView.Adapter=taskList;
}
公共类TaskListAdapter:BaseAdapter{
活动上下文=null;
IList tasks=新列表();
公共TaskListAdapter(活动上下文,IList任务):基本()
{
this.context=上下文;
这个。任务=任务;
}
这是我的错误:
Error CS0266: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Linq.IGrouping<System.DateTime,Tasky.Core.Task>>' to 'System.Collections.Generic.IList<Tasky.Core.Task>'. An explicit conversion exists (are you missing a cast?) (CS0266) (TaskyAndroid)
错误CS0266:无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.IList”。存在显式转换(是否缺少强制转换?)(CS0266)(TaskyAndroid)
请将生成的IEnumerable
转换为IList
,例如:
tasks = TaskManager
.GetTasks()
.GroupBy(x=> x.Created_date)
.Distinct()
.Cast<Tasky.Core.Task>()
.ToList();
tasks=TaskManager
.GetTasks()
.GroupBy(x=>x.Created\u日期)
.Distinct()
.Cast()
.ToList();
顺便问一下,为什么在这里使用
GroupBy()
子句?我认为选择(x=>x.Created\u date)。Distinct()
应该这样做。您的任务对象没有实现IList,您需要转换它(不是铸造它,铸造不会有帮助,它不是铸造错误,它不是真正实现ilist的东西,因为它只是linq返回的IEnumerable,没有实际的物理集合支持)
最简单的方法是将它转换成一个列表(它实现了IList),所以在您的distinct之后,只需抛出一个.ToList()
请确保将类中任务的定义更改为IList,否则它仍将被视为IEnumerable,或者如果无法更改该定义,请确保同时更改对TaskListAdapter的调用以包含(现在有效)强制转换
taskList=newadapters.TaskListAdapter(此(IList)任务);
请注意,这解决了您的铸造问题,但仍然没有意义,因为groupby(您有一个组列表,而不是任务列表)因此,您需要先删除它或修改查询,以仅枚举任务作为结束。这种转换没有任何意义,您正在转换groupby的结果,它将是一组日期时间和任务的I分组,而不是一组任务,因此肯定无法编译。非常感谢!您的解释明确地帮助我指出了问题所在方向正确(特别是最后一段)。干杯,伙计!
tasks = TaskManager.GetTasks ().GroupBy(x=> x.Created_date).Distinct().ToList();
taskList = new Adapters.TaskListAdapter(this, (IList<Task>)tasks);