从ObservableCollection<T>中删除重复项

4

我有一个 ObservableCollection<DateTime> myItems

里面有一些需要被删除的重复项

我尝试使用以下方法进行去重:

myItems = myItems.Distinct();

然而我无法构建它并收到以下错误:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.ObjectModel.ObservableCollection'. An explicit conversion exists (are you missing a cast?)

当我检查ObservableCollection时,我发现它是如下Go to Definition所示的IEnumerable<T>格式:

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();

编译没有错误,但运行时会抛出以下错误:

类型“System.InvalidCastException”的异常在 mscorlib.ni.dll 中发生,但未在用户代码中处理。其他信息:无法将类型为 'd__81<code>1[System.DateTime]' 的对象强制转换为类型 'System.Collections.ObjectModel.ObservableCollection</code>1[System.DateTime]'。

我还尝试了以下:

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

但是我收到了以下的编译时错误:

Error 1 无法将类型'System.Collections.Generic.List'转换为类型'System.Collections.ObjectModel.ObservableCollection'

我错过了什么? 我该如何从ObservableCollection中删除重复项?


1
使用IEnumerable构造函数投射一个新的可观察集合:https://dev59.com/lHA65IYBdhLWcg3w7DT8 - StuartLC
2个回答

8
如何呢?
myItems = new ObservableCollection<DateTime>(myItems.Distinct());

3

你忽略了一个事实,Distinct 返回的是一个 IEnumerable<T>,而不是一个 ObservableCollectionToList 返回的是一个 List<T>,也不是一个 ObservableCollection

这些类型不能转换为 ObservableCollection,所以你不能直接进行转换。需要创建一个新的 ObservableCollection 并用新项填充它。

你可以使用 ObservableCollection<T> 的构造函数 进行操作,或者你也可以实现自己的方法(如果你喜欢使用 Linq 的流畅语法):

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;
}

你的解释很好,但是我被错误信息愚弄了,它是误导性的[存在显式转换(你是否缺少一个强制转换?)]。所以我所有的搜索都是关于[缺少强制转换] :( - stackunderflow
1
如果类型之间没有定义隐式转换,编译器会建议你显式地进行强制类型转换。如果这也不可能,那么就像你的例子一样,在运行时会抛出 InvalidCastException 异常 :) - Selman Genç

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接