晚上好。
我有一个类的列表,我想根据不同的原因编制索引,一个是我想在不同的时间以不同的顺序读取数据。我遇到的麻烦是我无法理解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数据库之类的东西会更容易,但我更喜欢在没有数据库选项的情况下这样做。
任何帮助都将不胜感激。
答案 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();