2016-04-06 14 views
0

yeni. İki listelem var, bir "dataTransactions" (benzin istasyonları yakıtı) ve benzer bir "dataTransfers" (kayma tanklarından yakıt).AddRange'dan sonra bir listeyi nasıl sıralayabilirim? C#, SQL ve Linq için

Her biri SQL'den farklı bir tabloya erişir ve daha sonra birleştirilir. Sonunda

 List<FuelLightTruckDataSource> data = new List<FuelLightTruckDataSource>(); 

     using (SystemContext ctx = new SystemContext()) 
     { 

      List<FuelLightTruckDataSource> dataTransactions 
       = ctx.FuelTransaction 
        .Where(tx => DbFunctions.TruncateTime(tx.DateTime) >= from.Date && DbFunctions.TruncateTime(tx.DateTime) <= to.Date 
         //&& tx.AssetFilled.AssignedToEmployee.Manager 
         && tx.AssetFilled.AssignedToEmployee != null 
         //& 
         && tx.AssetFilled.AssetType.Code == "L" 
         && (tx.FuelProductType.FuelProductClass.Code == "GAS" || tx.FuelProductType.FuelProductClass.Code == "DSL")) 
        .GroupBy(tx => new { tx.AssetFilled, tx.DateTime, tx.FuelProductType.FuelProductClass, tx.FuelCard.FuelVendor, tx.City, tx.Volume, tx.Odometer}) //Added tx.volume to have individual transactions 
        .Select(g => new FuelLightTruckDataSource() 
        { 
         Asset = g.FirstOrDefault().AssetFilled, 
         Employee = g.FirstOrDefault().AssetFilled.AssignedToEmployee, 
         ProductClass = g.FirstOrDefault().FuelProductType.FuelProductClass, 
         Vendor = g.FirstOrDefault().FuelCard.FuelVendor, 
         FillSource = FuelFillSource.Transaction, 
         Source = "Fuel Station", 
         City = g.FirstOrDefault().City.ToUpper(), 
         Volume = g.FirstOrDefault().Volume, 
         Distance = g.FirstOrDefault().Odometer, 
         Date = g.FirstOrDefault().DateTime 

        }) 
        .ToList(); 

, birlikte iki listeyi koymak ve bir yakıt tüketimi raporu oluşturmak için
  data.AddRange(dataTransactions); 
      data.AddRange(dataTransfers); 

kullanın. Her iki liste de Tarihe göre ayrı ayrı sıralanır, ancak "AddRange" ifadesinden sonra "dataTransfers" ifadesi sonlandırmaya son eklenir ve sıralama tarihime göre kaybedilir. Kombine sonucu "AddRange" komutunu kullandıktan sonra tarihe göre nasıl sıralarım?

data = data.OrderBy(d => d.Date).ToList(); 

Yoksa inen sipariş etmek istiyorum:

cevap

5

bu deneyin

data = data.OrderByDescending(d => d.Date).ToList(); 
+0

Mükemmel. İyi çalıştı. Bir diğer sorun, kilometre sayacı okumasına dayalı olarak kat edilen mesafeyi hesaplamam gerekiyor. Bu mesafeyi hesaplamak için o "veri" listesinin mevcut ve önceki değerlerine nasıl erişirim? – RFS

1

Sen List<T>.Sort(delegate) çağırabilir.

https://msdn.microsoft.com/en-us/library/w56d4y5z(v=vs.110).aspx

Örnek:

data.Sort(delegate(FuelLightTruckDataSource x, FuelLightTruckDataSource y) 
{ 
    // your sort logic here. 
}); 

Avantaj: Bu OrderBy olduğu gibi bu tür yeni IList<T> örneğini oluşturmaz. Bu küçük bir şey, ama bazı insanlar için, özellikle performans ve hafızaya duyarlı durumlar için önemlidir.