在Linq列表排序方面遇到问题

时间:2017-11-14 10:39:08

标签: c# linq sorting

晚上好。

我有一个类的列表,我想根据不同的原因编制索引,一个是我想在不同的时间以不同的顺序读取数据。我遇到的麻烦是我无法理解LINQ的排序。

我列表中的类与此类似(这是一个较小的版本)

List<SalesRecord> Records = new List<SalesRecord>();
class SalesRecord
{
    public Int16 SalesID { get; set; }
    public Int32 Invoice { get; set; }
    public DateTime BookoutDate { get; set; }
}

记录的计数大小约为500,000

我的想法是创建一些列表,以特定的顺序引用记录中的每个项目

例如:

List<int> BookoutDateIndex;
List<int> InvoiceIndex;

Records[BookoutDateIndex[0]].BookoutDate // Oldest date
Records[BookoutDateIndex[1]].BookoutDate // Second oldest date
                                         // etc

根据我所看到的信息,我发现最接近我想要的就是这个......

// Copy dates to new list
List<DateTime> BookoutDates = new List<DateTime>();

for (int salesRecordIndex = 0; salesRecordIndex < records.Count; salesRecordIndex++)
    BookoutDates.Add(Records[salesRecordIndex].BookoutDate);

// Sort list

var sorted = Indexes.BookoutDates
    .Select((x, i) => new KeyValuePair<DateTime, int>(x, i))
    .OrderBy(x => x.Key)
    .ToList();

虽然这有效,但我不希望索引中的实际日期,我不想事先在新列表中复制日期。

我意识到通过将数据加载到Access数据库之类的东西会更容易,但我更喜欢在没有数据库选项的情况下这样做。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您想要的摘要:主列表的索引列表按主列表中的某个字段排序?

由于LINQ&#39; OrderBy实际上并没有改变输入,因此最终得到了:

var sorted = Indexes.BookoutDates
                     .Select((x, i) => new KeyValuePair<DateTime, int>(x, i))
                     .OrderBy(x => x.Key)
                     .ToList();

您正在使用值类型(KeyValuePair)来减少匿名类型带来的分配。但是没有必要首先创建一个单独的日期列表。只需从基础列表开始。

Key的{​​{1}}属性是第一个构造函数参数。

KeyValuePair

答案 1 :(得分:1)

当然你只想要:

var sorted = Records
    .OrderBy(x => x.BookoutDate)
    .ToList();