使用LINQ将IEnumerable转换为IList以使用Distinct Dates填充ListView适配器

时间:2015-04-11 01:33:42

标签: c# xamarin

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

2 个答案:

答案 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()应该这样做。