Home > Net >  Ranking sums from first to third c#
Ranking sums from first to third c#

Time:10-27

I want to rank the number i added up from first to third but i cant think of a way to rank it properly since when there is a duplicate it will only show the number once and continues to the second highest

im new to the language and it would be great for someone to help me on this

Edit: Sorry i think there is a misunderstanding here my sums are in an array that is connected to the names in another array and im trying to sort it out with the same index value

Edit 2: Also i am stuck at c# 7.3 so i cant use some of the new codes

int first = Int32.MinValue;
            int fs, nd, thr;
            int temp = 0;
            for (fs = 0; fs < hounds; fs  )
            {
                if (score_SUM[fs] > first)
                {
                    first = score_SUM[fs];
                    temp = fs;
                }
            }
            Console.WriteLine("\n"   "First:{1} {0}", first, houndname[temp]);

            int second = Int32.MinValue;
            for (nd = 0; nd < hounds; nd  )
            {

                if (score_SUM[nd] > second && score_SUM[nd] < first)
                {
                    second = score_SUM[nd];
                    temp = nd;
                }
            }
            Console.WriteLine("Second:{1} {0}", second, houndname[temp]);

            int third = Int32.MinValue;
            for (thr = 0; thr < hounds; thr  )
            {

                if (score_SUM[thr] > third && score_SUM[thr] < second)
                {
                    third = score_SUM[thr];
                    temp = thr;
                }
            }
            Console.WriteLine("Third:{1} {0}", third, houndname[temp]);
            Console.ReadLine();

example

10 , 5 , 10 , 6, 1

The output will be like

10 6 5

But I expected

10 10 6

but i cant find a way to write a block a code for that

CodePudding user response:

Does this answer your question?

List<int> list = new() { 10, 5, 10, 6, 1 };

list.Sort((x, y) => y.CompareTo(x));
for (int i = 0; i < 3; i  )
{  
Console.WriteLine(list[i]);
}

If you only want the three highest values you can also do this:

List<int> list = new() { 10, 5, 10, 6, 1 };
IEnumerable<int> highestValues = list.OrderByDescending(x => x).Take(3);
foreach (int value in highestValues)
{
Console.WriteLine(value);
}

CodePudding user response:

You're drastically over-engineering this.

If what you have is an array (or list/collection of some kind) of values then you can simply sort that array (descending in this case) and display the first three values.

For example, consider this list of values:

var hounds = new List<int> { 10, 5, 10, 6, 1 };

Then you can sort that list:

hounds = hounds.OrderByDescending(h => h).ToList();

And, either in a loop or by directly referencing the first three (if you know there will always be at least three), output them. For example:

Console.WriteLine("First:{0}", hounds[0]);
Console.WriteLine("Second:{0}", hounds[1]);
Console.WriteLine("Third:{0}", hounds[2]);

Regarding your edit...

my sums are in an array that is connected to the names in another array and im trying to sort it out with the same index value

You're doing it wrong.

Instead of trying to manually keep multiple arrays of values synchronized, maintain one array of meaningful objects. For example, consider how you define a "hound":

public class Hound
{
    public int Value { get; set; }
    public string Name { get; set; }
}

Create your list of hounds, not multiple lists of disconnected and unrelated values that you need to manually remember and keep synchronized. For example:

var hounds = new List<Hound>
{
    new Hound { Value = 10, Name = "Fido" },
    new Hound { Value = 5, Name = "Barney" },
    new Hound { Value = 10, Name = "Jake" },
    new Hound { Value = 6, Name = "Woof" },
    new Hound { Value = 1, Name = "Dog" }
};

The rest of the process is the same. Sort the list:

hounds = hounds.OrderByDescending(h => h.Value);

And output the data:

Console.WriteLine("First:{1} {0}", hounds[0].Value, hounds[0].Name);
Console.WriteLine("Second:{1} {0}", hounds[1].Value, hounds[1].Name);
Console.WriteLine("Third:{1} {0}", hounds[2].Value, hounds[2].Name);

Overall, the main point here is that you don't need a ton of convoluted logic just to get the top 3 values in a list. Sorting is a common and well-established operation. All you need is the right data structure to be sorted.

Or, as usual, someone else has already said it better before...

"Smart data structures and dumb code works a lot better than the other way around."
Eric S. Raymond, The Cathedral & the Bazaar

CodePudding user response:

Just change your < symbols to <= symbols. So your checks for the second and third ranks would look something like this:

// check for second
if (score_SUM[nd] > second && score_SUM[nd] <= first)
...

// check for third
if (score_SUM[thr] > third && score_SUM[thr] <= second)
...
  • Related