C# 使用LINQ将IEnumerable转换为IList以使用不同日期填充ListView适配器

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 (

我正在尝试用唯一的日期填充我的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 ()
    {
        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);