2016-07-15 7 views
1

私はリスト<を持っています。> finalReportDetailsで、同じWebsiteIdとCheckInDateに対して複数の料金が含まれています。 私は各ウェブサイトのIDとcheckindateに対して1つのレコードしか持たないといけません。 このレコードは、最低レート(第1優先)またはレート-1を持つ必要があります。 このグループのすべてのレコードはリストから削除する必要があります。リスト内の最低料金を特定

初期リスト

List<Rates> rates = new List<Rates>() 
    { 
     new Rates { CheckInDate = timeValue, websiteId = 1, price = 1 }, 
     new Rates { CheckInDate = timeValue, websiteId = 1, price = 2 }, 
     new Rates { CheckInDate = timeValue, websiteId = 2, price = -1 }, 
     new Rates { CheckInDate = timeValue, websiteId = 2, price = 2 }, 
     new Rates { CheckInDate = timeValue, websiteId = 3, price = -1 }, 
     new Rates { CheckInDate = timeValue, websiteId = 3, price = -1 }, 
    }; 

最終リスト

List<Rates> rates = new List<Rates>() 
     { 
      new Rates { CheckInDate = timeValue, websiteId = 1, price = 1 }, 
      new Rates { CheckInDate = timeValue, websiteId = 2, price = 2 }, 
      new Rates { CheckInDate = timeValue, websiteId = 3, price = -1 }, 
     }; 

私はこのコードを試してみましたが、ループを通過することは多くの時間を要しています。 まず、CheckInDate、WebsiteIdによって異なるグループが見つかりました。 各グループについて、私は必要な率をチェックしています。

class Rates { 
    public int websiteId {get; set;}, 
    public DateTime CheckInDate {get; set;} 
    public decimal price {get; set;}} 


var grouped = (from s in finalReportDetails 
          select new { s.CheckInDate,s.websiteId }) 
          .Distinct() 
          .ToList(); 

for (int i = 1; i <= grouped.Count && finalReportDetails.Count != grouped.Count; i++) 
{ 
    var obj = grouped[i - 1]; 

    // Fetch records for one group, order by rate to find the least Rate 
    var grpFinalReportDetails = (from s in Rates 
           where && s.CheckInDate == obj.CheckInDate && s.websiteId == obj.websiteId 
           select s).OrderBy(x => x.price).ToList(); 

    // Deletion necessary only if there is more than one rate for same parameters 
    if (grpFinalReportDetails.Count > 1) 
    { 
     // Tracks if a valid rate is found 
     bool isFound = false; 
     for (int j = 0; j < grpFinalReportDetails.Count; j++) 
     { 
      // Checks if a valid least rate is found 
      if (!isFound && grpFinalReportDetails[j].InitialRates.Rates > 0) 
      { 
       isFound = true; 
       continue; 
      } 

      // Delete all but one records whose Rate is less than 0 OR whose rate is more than the cheapest rate 
      if ((grpFinalReportDetails[j].InitialRates.Rates <= 0 && j < grpFinalReportDetails.Count - 1) || isFound) 
      { 
       finalReportDetails.Remove(grpFinalReportDetails[j]); 
      } 
     } 
    } 
} 

linqを使用して同じ方法を見つける方法はありますか? またはこのコードでoptmizedできるもの。

答えて

1

このLINQクエリは、あなたがやりたいかもしれないようだ - 少なくとも、それはあなたの例を渡します

var result = rates 
    .GroupBy(rate => rate.websiteId) 
    .Select(@group => 
     @group.Any(rate => rate.price > 0) 
      ? @group.Where(rate => rate.price > 0).OrderBy(rate => rate.price).First() 
      : @group.OrderBy(rate => rate.price).First()) 

groupが予約語であるため、変数名@group@サインがありますあなたが別の変数名を選択した場合は、@は必要ありません。

これはあなたの列挙型を何度も反復する可能性があることに注意してください。高価な操作を複数回呼び出さないように、最初に.ToList()を呼び出してください。

+0

は完璧に動作します...ありがとう!!! –

1
//Some initializing code for testing 
var timeValue = DateTime.Now; 
List<Rates> rates = new List<Rates>() 
{ 
    new Rates { CheckInDate = timeValue, websiteId = 1, price = 1 }, 
    new Rates { CheckInDate = timeValue, websiteId = 1, price = 2 }, 
    new Rates { CheckInDate = timeValue, websiteId = 2, price = -1 }, 
    new Rates { CheckInDate = timeValue, websiteId = 2, price = 2 }, 
    new Rates { CheckInDate = timeValue, websiteId = 3, price = -1 }, 
    new Rates { CheckInDate = timeValue, websiteId = 3, price = -1 }, 
}; 

//The actual relevant code 
var result = rates.GroupBy(item => new { item.websiteId, item.CheckInDate }) 
        .Select(grp => grp.Any(item => item.price != -1) ? 
         grp.Where(item => item.price != -1).OrderBy(item => item.price).First() : 
         grp.First()) 
        .ToList(); 
+0

なぜgroup.Min(item => item.price)ではないのですか? – misha130

+0

''価格 'によって' Min'はグループの最低価格を返しますが、私が望むものは最も低い 'price'を持つ' Rate'です。 –

+0

1つの問題があります。私は価格= -1でいくらかのレートを持っています。私は、最低価格(> 0)(第1希望)、または価格-1のレートを選択する必要があります。 –

関連する問題