Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 如何处理可观察的类集合_C#_Linq_Sorting_Observablecollection - Fatal编程技术网

C# 如何处理可观察的类集合

C# 如何处理可观察的类集合,c#,linq,sorting,observablecollection,C#,Linq,Sorting,Observablecollection,我有以下TraceFeldPartProgramClass public class TracefieldPartProgramClass { public TracefieldPartProgramClass() { } public ObservableCollection<Tuple<string, object, object>> obcTraceFieldPartProgram = new ObservableCollection<Tupl

我有以下TraceFeldPartProgramClass

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