C# 如何处理可观察的类集合
我有以下TraceFeldPartProgramClassC# 如何处理可观察的类集合,c#,linq,sorting,observablecollection,C#,Linq,Sorting,Observablecollection,我有以下TraceFeldPartProgramClass public class TracefieldPartProgramClass { public TracefieldPartProgramClass() { } public ObservableCollection<Tuple<string, object, object>> obcTraceFieldPartProgram = new ObservableCollection<Tupl
public class TracefieldPartProgramClass
{
public TracefieldPartProgramClass() { }
public ObservableCollection<Tuple<string, object, object>> obcTraceFieldPartProgram = new ObservableCollection<Tuple<string, object, object>>();
}
我使用它进行以下收集:
ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>();
现在,在填充它之后,我希望能够按照我希望在Tracefield[0]上所说的那样进行排序。
所以我实施了这个:
private ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> SortOnTracefield(ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> obcToSort)
{
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>();
obcSorted = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());<--- this is where I get the error
return obcSorted;
}
但当我这样做时,我会得到以下错误:
错误CS0266无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Collections.ObjectModel.ObservableCollection”。存在显式转换。是否缺少强制转换
试试这个:
private ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> SortOnTracefield(ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass> obcToSort)
{
var sorted = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString();
return new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sorted);
}
但是,您的TraceFeldPartProgramClass类需要实现IComparable,或者您需要实现一个自定义IComparaler并将排序方法传递给它。Enumerable.OrderBy不返回ObservableCollection,而是返回IEnumerable,您可以使用以下命令创建一个新的IComparaler:
正如错误所说,您试图将IOrderedEnumerable分配给ObservableCollection类型的变量,这是不可能的 但幸运的是,ObservaleCollection有一个接受IEnumerable并用该IEnumerable的项作为前缀的 因此,为了消除该错误,请使用:
var sortedEnumerable = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());
obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sortedEnumerable );
为什么使用IList构造函数而不是IEnumerable构造函数?这对性能有什么好处吗?@Domysee:the是一个no-op,IEnumerable构造函数将通过枚举所有元素创建一个列表。因此您可以同时使用这两种方法。但是列表构造函数也会创建传递列表的副本,因此IEnumerable构造函数在我看来更合适。@IvanStoev:没有看到关于VSWhidbey bug 562681的评论,所以您是对的。如果我还没有列表,那么我更喜欢IEnumerable构造函数。
var obcSortedList = obcToSort
.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString())
.ToList();
var obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(obcSortedList);
var sortedEnumerable = obcToSort.OrderBy(w => w.obcTraceFieldPartProgram[0].Item3.ToString());
obcSorted = new ObservableCollection<EasyRunBinSerializableData.TracefieldPartProgramClass>(sortedEnumerable );