Skip to main content

Problem with delegate within foreach

The picture shown below represents my data. Data that I have and the expected result at the end:




The logic being, that for every date in the list of dates, find the associated price tuple where the effective date is less than or equal to the date and is the max date.

The structure of Price is shown below.

 
public class Price
{
public int PriceId { get; set; }

public DateTime EffectiveDate { get; set; }

public double PriceAmount { get; set; }

public DateTime CreatedOn { get; set; }
}

I have a static method that gets me the data that I need
 
static List<Price> GetPrices()
{
return new List<Price>()
{
new Price()
{
PriceId = 1, EffectiveDate = new DateTime(2012,1,1),
PriceAmount = 100, CreatedOn = new DateTime(2012,1,1)
},
new Price()
{
PriceId = 2, EffectiveDate = new DateTime(2012,1,1),
PriceAmount = 200, CreatedOn = new DateTime(2012,1,1)
},
new Price()
{
PriceId = 3, EffectiveDate = new DateTime(2012,1,2),
PriceAmount = 300, CreatedOn = new DateTime(2012,1,2)
},
new Price()
{
PriceId = 4, EffectiveDate = new DateTime(2012,1,3),
PriceAmount = 400, CreatedOn = new DateTime(2012,1,3)
},
new Price()
{
PriceId = 5, EffectiveDate = new DateTime(2012,1,4),
PriceAmount = 500, CreatedOn = new DateTime(2012,1,4)
},
new Price()
{
PriceId = 6, EffectiveDate = new DateTime(2012,1,5),
PriceAmount = 600, CreatedOn = new DateTime(2012,1,5)
},
new Price()
{
PriceId = 7, EffectiveDate = new DateTime(2012,1,16),
PriceAmount = 700, CreatedOn = new DateTime(2012,1,16)
},
new Price()
{
PriceId = 8, EffectiveDate = new DateTime(2012,1,27),
PriceAmount = 800, CreatedOn = new DateTime(2012,1,27)
},
new Price()
{
PriceId = 9, EffectiveDate = new DateTime(2012,1,28),
PriceAmount = 900, CreatedOn = new DateTime(2012,1,28)
},
};
}

This is the original code that I wrote to get me the information that I needed:

 
// This represents your List of dates
var listOfDates = new List<DateTime>()
{
new DateTime(2012,1,2),
new DateTime(2012,1,10),
new DateTime(2012,1,15),
new DateTime(2012,1,27)
};

// This represents your prices
var prices = GetPrices();

// Initialise the expected result set
var expectedResultSet = new List<Price>();

// Get your expected result set
listOfDates.ForEach(date =>
{
// In each date, find the price that you're after
var price = prices
.Where(p => p.EffectiveDate <= date)
.OrderByDescending(result => result.EffectiveDate)
.FirstOrDefault();

if(price != null)
{
// Fix the Date
price.EffectiveDate = date;

// Add it to the expected result
expectedResultSet.Add(price);
}
});

// Print the Result
Print(expectedResultSet);

If you check the output, this does NOT give you the result you were expecting!!!
Now to get the result you're after, you'll need to iterate through the list in a different manner:

(This is just one option ... )

 
// Get Dates and Prices
listOfDates = GetListOfDates();
prices = GetPrices();

// Step A: Get a Tuple of Date & Price
List<Tuple<DateTime, Price>> datesWithAssociatedPrice;
datesWithAssociatedPrice = listOfDates
// Step 1: Select the Requested Date and Price(S)
// where the Price's Effective Date <= the date (from range)
// [One Date .. Many Prices]
.Select(eachDate => new
{
RequestedDate = eachDate,
AssociatedPrices = prices.Where(p => p.EffectiveDate <= eachDate)
})

// Step 2: Now iterate through the list of Date, List & in each tuple,
// find the first instance of Price with the Max Effective date
.Select(dateAndPrice => new
{
RequestedDate = dateAndPrice.RequestedDate,
AssociatedPrice = dateAndPrice
.AssociatedPrices
.First(price => price.EffectiveDate ==
dateAndPrice.AssociatedPrices.Max(item => item.EffectiveDate))
})

// Step 3: Now get the data you need as a List<Tuple<DateTime, Price>> tuple
.Select(tuple =>
new Tuple<DateTime, Price>(tuple.RequestedDate,
tuple.AssociatedPrice)).ToList();

// Print using an extension method :)
Print(datesWithAssociatedPrice.ToPriceList());

And now the result is what is expected.


The complete source is available here: http://snipt.org/zQjc0#expand


References: http://stackoverflow.com/questions/2571398/problem-with-anonymouse-delegate-within-foreach


Comments

Popular posts from this blog

Internet Information Services(IIS) reveals its real or internal IP Address

In the ever changing world of global data communications, inexpensive Internet connections, and fast-paced software development, security is becoming more and more of an issue. Security is now a basic requirement because global computing is inherently insecure.

Keeping that in mind, we recently ran our flagship product through a security audit. It was such a helpful exercise in tying-off any remaining lose ends in our application in terms of application security. 
Based on the security audit report, there was a relatively minor issue that appeared when accessing the /images directory of our application. Turns out that the Location response header of the 301 request returns an Internal IP address. The issue is detailed below.

Issue reportedInternet Information Services (IIS) may reveal its real or internal IP address in the Location header via a request to the /images directory. The value returned whilst pen testing is https://10.0.0.10/images.

The riskInformation regarding internal IP add…

C# Console app that displays twitter feed using Linq To Twitter (using Single User Authorization)

I recently had to add a twitter feed to my existing ASP.NET MVC 4 application. All I had to do was pull the last 10 tweets for a given user. It took me a while (shamefully, 3 hours) to get it working so I thought of writing a simple tutorial that explains how to pull a twitter feed for a console app using LINQ to Twitter.

LINQ to Twitter is an open source 3rd party LINQ Provider for the Twitter micro-blogging service. It uses standard LINQ syntax for queries and includes method calls for changes via the Twitter API
What took me long to figure out was the way twitter has implemented authentication using OAuth. Before you do anything, make sure you read the Learning to use OAuth document.
In my example, I used Single User Authorization. Single User Authorization is designed for scenarios where you'll only ever have one account accessing Twitter. i.e. if your Web site does periodic Twitter updates, regardless of user or you have a server that monitors general information. 
Before we be…

Unit Testing HttpContext.Current.Session in MVC3 .NET

We recently changed some functionality where during the "CREATE" process, we go through a wizard to save application data. This data is saved only to the session in the final step when the user clicks the final submit.

This was easy enough to implement but when I started writing unit tests for my static methods that Add, Update, Delete or Modify the contents of our application data in the session, I got the following error:
System.NullReferenceException: Object reference not set to an instance of an object.

Turns out I had forgotten to setup the HttpContext.
The following "TestInitialise" method fixed my problem :)

[TestInitialize]
public void TestSetup()
{
// We need to setup the Current HTTP Context as follows:

// Step 1: Setup the HTTP Request
var httpRequest = new HttpRequest("", "http://localhost/", "");

// Step 2: Setup the HTTP Response
var httpResponce = new HttpResponse(new StringWriter());

// Step 3: Se…