我正在尝试使用唯一的日期填充我的ListView适配器。我正在尝试使用LINQ从我的数据库中提取不同的日期。注意:对象'任务'被宣布为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 ()
{
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;
}
这是我的错误:
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)
答案 0 :(得分:1)
你的任务对象没有实现IList,你需要转换它(不要强制转换它,强制转换不会有帮助,它没有被错误地转换,它真的不是实现ilist的东西,因为它只是linq返回的IEnumerable,而不是由实际的物理集合支持。)
最简单的方法是将它变成一个List(它确实实现了IList),所以在你的不同之后,简单地抛出一个.ToList();
tasks = TaskManager.GetTasks ().GroupBy(x=> x.Created_date).Distinct().ToList();
确保将您班级中任务的定义更改为IList,否则它仍将被视为IEnumerable,或者如果您无法更改该定义,请确保您还更改对TaskListAdapter的调用以包含(现在有效)演员。
taskList = new Adapters.TaskListAdapter(this, (IList<Task>)tasks);
请注意,这解决了您的投射问题,但由于groupby(您有一个组列表,而不是任务)仍然没有任何意义,所以您需要先将其删除或重新编写查询,最后才能使用任务列举。
答案 1 :(得分:-1)
请将结果IEnumerable
投放到IList
,例如像这样:
tasks = TaskManager
.GetTasks()
.GroupBy(x=> x.Created_date)
.Distinct()
.Cast<Tasky.Core.Task>()
.ToList();
顺便说一句,你为什么在这里使用GroupBy()
条款?我认为.Select(x => x.Created_date).Distinct()
应该这样做。