65.9K
CodeProject is changing. Read more.
Home

Get the Nth Minimum or Nth Maximum Number from a Collection C#

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (4 votes)

Apr 21, 2014

CPOL
viewsIcon

19391

Get the Nth Minimum or Nth Maximum Number from a Collection C#

Introduction

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);

CodeProject