从ObservableCollection <t> </t>中删除重复项

时间:2014-07-02 08:26:37

标签: c# linq observablecollection

我有ObservableCollection<DateTime> myItems

它有一些需要删除的重复项目

我尝试使用:

myItems = myItems.Distinct();

但是我无法构建它并收到此错误:

  

错误1无法隐式转换类型   &#39; System.Collections.Generic.IEnumerable&#39;至   &#39; System.Collections.ObjectModel.ObservableCollection&#39 ;.   存在显式转换(您是否错过了演员?)

当我检查ObservableCollection时,我发现它是IEnumerable<T>,如以下Go to Definition显示:

public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged

public class Collection<T> : IList<T>, ICollection<T>, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

所以我试着施展如下:

myItems = (ObservableCollection<DateTime>) myItems.Distinct();

它没有错误地构建好;但在运行时它会抛出以下错误:

  

类型&#39; System.InvalidCastException&#39;的例外情况发生在   mscorlib.ni.dll但未在用户代码中处理   信息:无法转换类型的对象   &#39; {d__81 {1}} 1的System.DateTime]&#39;

我也尝试了以下内容:

1[System.DateTime]' to type
  'System.Collections.ObjectModel.ObservableCollection

但后来我发现了以下编译时错误:

  

错误1无法转换类型   &#39; System.Collections.Generic.List&#39;至   &#39; System.Collections.ObjectModel.ObservableCollection&#39;

我在这里缺少什么? 以及如何从ObservableCollection中删除重复的项目?

2 个答案:

答案 0 :(得分:5)

怎么样

myItems = new ObservableCollection<DateTime>(myItems.Distinct());

答案 1 :(得分:3)

您错过了Distinct返回IEnumerable<T>的事实,ObservableCollection不是ToListList<T>还会返回ObservableCollection,而ObservableCollection也不是ObservableCollection

这些类型无法转换为ObservableCollection<T>,因此您无法直接转换它们。您需要创建一个新的public static ObservableCollection<T> ToObservableCollection<T>( this IEnumerable<T> source) { var collection = new ObservableCollection<T>(); foreach(var item in source) collection.Add(item); return collection; } 并使用新项填充它。

你可以使用{{1}}的{​​{3}}来做到这一点,或者你也可以实现自己的方法(如果你想使用流利的linq语法):

{{1}}