Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ObservableCollection中删除副本<;T>;_C#_Linq_Observablecollection - Fatal编程技术网

C# 从ObservableCollection中删除副本<;T>;

C# 从ObservableCollection中删除副本<;T>;,c#,linq,observablecollection,C#,Linq,Observablecollection,我有一个可观察的myItems集合 它有一些重复的项目需要删除 我尝试使用: myItems = myItems.Distinct(); 但是,我无法构建它并收到此错误: 错误1无法隐式转换类型 “System.Collections.Generic.IEnumerable”到 “System.Collections.ObjectModel.ObservableCollection”。 存在显式转换(是否缺少强制转换?) 当我检查ObservableCollection时,我发现它是IEnum

我有一个可观察的myItems集合

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

我尝试使用:

myItems = myItems.Distinct();
但是,我无法构建它并收到此错误:

错误1无法隐式转换类型 “System.Collections.Generic.IEnumerable”到 “System.Collections.ObjectModel.ObservableCollection”。 存在显式转换(是否缺少强制转换?)

当我检查ObservableCollection时,我发现它是
IEnumerable
,如下所示:

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
但随后我发现了以下编译时错误:

错误1无法转换类型 “System.Collections.Generic.List”到 'System.Collections.ObjectModel.ObservableCollection'

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

如何

myItems = new ObservableCollection<DateTime>(myItems.Distinct());
myItems=新的ObservableCollection(myItems.Distinct());
怎么样

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

您忽略了一个事实,
Distinct
返回一个
IEnumerable
,它不是
可观察的集合。和
ToList
返回一个
列表
,该列表也不是
可观察集合

这些类型不能转换为
ObservableCollection
,因此不能直接强制转换它们。您需要创建一个新的
ObservableCollection
,并用新项目填充它

您可以使用of
ObservableCollection
来实现这一点,或者您也可以实现自己的方法(如果您喜欢使用linq的流畅语法):

公共静态ObservableCollection到ObservableCollection(
这是(不可数的来源)
{
var collection=新的ObservableCollection();
foreach(源中的var项)
集合。添加(项目);
回收;
}

您忽略了一个事实,
Distinct
返回一个
IEnumerable
,它不是
可观察的集合。和
ToList
返回一个
列表
,该列表也不是
可观察集合

这些类型不能转换为
ObservableCollection
,因此不能直接强制转换它们。您需要创建一个新的
ObservableCollection
,并用新项目填充它

您可以使用of
ObservableCollection
来实现这一点,或者您也可以实现自己的方法(如果您喜欢使用linq的流畅语法):

公共静态ObservableCollection到ObservableCollection(
这是(不可数的来源)
{
var collection=新的ObservableCollection();
foreach(源中的var项)
集合。添加(项目);
回收;
}

使用
IEnumerable
构造函数投影一个新的可观察集合:使用
IEnumerable
构造函数投影一个新的可观察集合:您的解释很好。。但我被错误信息愚弄了,它是误导性的[存在显式转换(你是否缺少演员阵容?)。。所以我所有的搜索都是关于[missing cast]:(@stackunderflow,如果类型之间没有定义隐式转换,编译器会建议您显式转换它,如果这也不可能,它会在运行时抛出
InvalidCastException
,就像您的示例:)您的解释很好。。但我被错误信息愚弄了,它是误导性的[存在显式转换(你是否缺少演员阵容?)。。所以我所有的搜索都是关于[missing cast]:(@stackunderflow,如果在类型之间没有定义隐式转换,编译器会建议您显式转换它,如果这也不可能,它会在运行时抛出
InvalidCastException
,就像您的示例:)
myItems = new ObservableCollection<DateTime>(myItems.Distinct());
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;
}