Get the Nth Minimum or Nth Maximum number from a collection C#

For a collection of integers/decimals, we can use the .Max() and .Min() to get the maximum and minimum value of the collection respectively.
However, there are two more case scenarios, that I have faced, which I am going to discuss next. Following is the definition of a class Item that I am going to use here:

class Item: IComparable<Item>
{
    public string itemName { get; set; }
    public int itemPrice { get; set; }

    int IComparable<Item>.CompareTo(Item other)
    {
        if (other.itemPrice > this.itemPrice)
            return -1;
        else if (other.itemPrice == this.itemPrice)
            return 0;
        else 
            return 1;
    }

 
	//Operator overloading 

	public static bool operator >(Item X, Item Y)
	{
		if (X == null && Y == null)
		{
			return false;
		}
		if (X == null)
		{
			return false; //true?
		}
		if (Y == null)
		{
			return true; //false? 

		}

		return X.itemPrice > Y.itemPrice;
	}

	public static bool operator <(Item X, Item Y)
	{
		if (X == null && Y == null)
		{
			return false;
		}
		if (X == null)
		{
			return true; //false?
		}
		if (Y == null)
		{
			return false; //true? 

		}

		return X.itemPrice < Y.itemPrice;
	} 
}

 

Populate some value to the collection


Item[] items = { new Item { itemName="Item1", itemPrice=10 },
                 new Item { itemName="Item2", itemPrice=20 },
                 new Item { itemName="Item3", itemPrice=30 }, 
                 new Item { itemName="Item4", itemPrice=40 } };

Get the Minimum number greater than a certain value OR Maximum number lesser than a certain value


//get the minimum valued item = Item1
int min = items.Min().itemPrice;//get the min valued item greater than the 2nd item = Item3
int min = items.Where(p => p > items[1]).DefaultIfEmpty().Min().itemPrice);
//get the maximum valued item = Item4
int min = items.Max().itemPrice;

//get the max valued item less than the 3rd item = Item2
int min = items.Where(p => p < items[2]).DefaultIfEmpty().Max().itemPrice);

 

Similarly, we can also get the element at each index


Item secondLowest = numbers.OrderBy(num => num).ElementAt(1);
Item secondHighest = numbers.OrderBy(num => num).Reverse().ElementAt(1);

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s