Archief - OrderBy ThenBy methode gebruiken

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

jos1920

Legacy Member
Hallo,

Ik heb bepaalde x en y coordinaten opgeslaan in een list en ik zou deze willen sorteren, ik heb dit al:


Code:
var sortedList = list.OrderBy(point=>point.a);
            foreach (Point p in sortedList)
            {
                FoutenX[i] = (int)p.a;
                FoutenY[i] = (int)p.z;
                i++;
            }

Maar het probleem is dat bij dezelfde X-waarden verschillende y-waarden kunnen voorkomen daarom wou ik :

var sortedList = list.OrderBy(point=>point.a).ThenBy(point.z => point.z);

Maar de bovenstaande regel doet niet wat ik zou willen

bv:
X: Y:

10 100
11 100
12 100
13 100
13 200
14 100
14 200
... ...

Tyfius

Legacy Member
jos1920 zei:
var sortedList = list.OrderBy(point=>point.a).ThenBy(point.z => point.z);

Ge moet daar niet point.z => point.z doen, maar gewoon point => point.z.

jos1920

Legacy Member
Ja idd, was een typfout.

met onderstaande code wil ik de inhoud van list weergeven met x gesorteerd van klein naar groot en dat samen met de y-waarden van klein naar groot.
Code:
 var sortedList = list.OrderBy(point => point.a).ThenBy(point => point.z);
            
            foreach (Point p in sortedList)
            {
                FoutenX[i] = (int)p.a;
                FoutenY[i] = (int)p.z;
                MessageBox.Show("geef de X" + FoutenX[i] +"  Y/"+ FoutenY[i]);
                i++;
            }

Maar dit werkt alleen bij de x-waarden. Doe ik iets verkeerd bij:

Code:
list.Add(new Point(a,z));

Tyfius

Legacy Member
Dat zou moeten werken. Ben je zeker dat de lijst fout is? Je kan hem misschien best eens gewoon afdrukken.

Ik heb even snel het volgende geprobeerd:
Code:
public class Point
{
	public Point(int x, int y)
	{
		X = x;
		Y = y;
	}
	
	public int X;
	public int Y;
	
	public override string ToString()
	{
		return String.Format("X: {0}; Y: {1}", X, Y);
	}
}

void Main()
{
	var list = new List<Point>
	{
		new Point(10, 100),
		new Point(11, 100),
		new Point(12, 100),
		new Point(10, 200),
		new Point(11, 200),
		new Point(10, 300),
	};
	
	var sortedList = list.OrderBy(p => p.X).ThenBy(p => p.Y);
	foreach (var point in sortedList)
	{
		Console.WriteLine(point);
	}
}
En dat geeft mij het volgende resultaat:
Code:
X: 10; Y: 100
X: 10; Y: 200
X: 10; Y: 300
X: 11; Y: 100
X: 11; Y: 200
X: 12; Y: 100
Dus de OrderBy() en ThenBy() functies werken hier zoals verwacht.

jos1920

Legacy Member
Ja maar het probleem is dat ik niet weet welke punten het gaan zijn. Het zijn telkens andere coordinaten. En het is de bedoeling om de x coordinaten te sorteren maar als bij één x coordinaat 2 of meerdere y-coordinaten zijn die dan ook te rangschikken bv:

x:10 y:100
x:11 y:100
x:12 y:100

x:10 y:200
x:11 y:200
x:12 y:200

jos1920

Legacy Member
Dit is de volledige code waarvoor ik de list wil gebruiken

Code:
 public static bool Tel(Bitmap b)
        {
            Color c;
            Graphics gr = Graphics.FromImage(b);
            GraphicsState graphicsState = gr.Save();
            Pen pen = new Pen(Color.Red, 2.0f);
     
           var list = new List<Point>();
           Point punten;
          
           int[] FoutenX = new int[5 * b.Width];
           int[] FoutenY = new int[5 * b.Height];
            /*
             * Variabelen die gebruikt zijn om bewerkingen te doen
             * */
            int verschil, verschil2;
            int posX, posY, posX2, posY2;
            int startX, startY;
            int plaats = 0;
            int q = 0;
            int i = 0;
            int teller=0;

            for (int z = 0; z < b.Height; z++)
            {
                for (int a = 0; a < b.Width; a++)
                {
                    // bepalen van de kleur op de huidige positie
                    c = b.GetPixel(a, z);
                    // is deze kleur wit --> fout
                    if (c.R == 255 && c.G == 255 && c.B == 255)
                    {
[B]                      [COLOR="Red"]  punten = new Point(a, z);
                        list.Add(punten);[/B]
                        plaats++;
                    }
                }
            }

          [B]  var sortedList = list.OrderBy(point => point.z).ThenBy(point => point.a);

            foreach (Point p in sortedList)
            {
                FoutenX[i] = (int)p.a;
                FoutenY[i] = (int)p.z;
                MessageBox.Show("geef de X" + FoutenX[i] +"  Y/"+ FoutenY[i]);
                i++;
            }[/B][/COLOR]

                for (int j = 0; j < plaats + 1; j++)
                {
                    // de positie van de fouten worden een variabele gestoken eveneels de volgende fout
                    posX = FoutenX[j];
                    // de volgende 
                    posX2 = FoutenX[j + 1];
                    posY = FoutenY[j];
                    // de volgende
                    posY2 = FoutenY[j + 1];

                    // startpositie van de fout
                    startX = FoutenX[q];
                    startY = FoutenY[q];

                    // verschil van de posities van de fouten wordt bepaald
                    verschil = Math.Abs(posX - posX2);
                    verschil2 = Math.Abs(posY - posY2);

                    // als het verschil groter is dan 10--> nieuwe groep van fouten
                    if (verschil <= 10 && verschil2 <= 10)
                    {
                        teller = 0;
                    }

                    else if (teller == 0)
                    {
                        /*
                         * De eigenschappen van de rechthoek
                         * */
                        Rectangle r = new Rectangle();
                        // eindpositie x
                        r.Width = posX - (startX - 10);
                        // eindpositie y
                        r.Height = posY - (startY - 10);
                        // De startposities
                        r.X = startX - 5;
                        r.Y = startY - 5;
                        // tekenen van de rechthoek
                        gr.DrawRectangle(pen, r);
                        q = j + 1; // de volgende startpositie                    
                        teller++;
                    }

                }
            
            return true;
        }

** Het vetgedrukt gedeelte is waar ik problemen mee heb

Tyfius

Legacy Member
Nu ben je wel voor verwarring aan het zorgen. Je wil eerst sorteren op 'a' en dan op 'z'? Je code doet anders het omgekeerde:
Code:
var sortedList = list.OrderBy(point => point.z).ThenBy(point => point.a);
Hier ga je namelijk eerst sorteren op 'z' en dan op 'a'. In dit geval zal het resultaat dus als volgt zijn:
Code:
10, 100
11, 100
12, 100
10, 200
11, 200
10, 300
Je zal dus gewoon de condities in OrderBy() en ThenBy() moeten omwisselen.

En anders zal je het probleem nog moeten verduidelijken want ik zie het probleem niet meer. De code die er nu staat geeft volgens mij het gewenste resultaat. Welke foutmelding krijg je, want is het resultaat dat je effectief krijgt en wat is het resultaat dat je wenst? Geef anders eens twee lijsten van punten na het sorteren. Hoe ziet die lijst er uit en hoe moet die er uit zien?

jos1920

Legacy Member
Dat is nu het probleem ik krijg niet het gewenste resultaat:

1eqlT
--> dit is het beeld wat ik krijg maar ik wil kaders rond alle witte lijnen. Bij de lijnen die dezelfde x-waarden hebben maar verschillende y-waarden worden de y-waarden niet gesorteerd, dat wisselt de hele tijd af:

100
150
100
150
100
150
...

Daarom wil ik :

100
100
...
100

150
150
...
150
:D

Cycloon

Legacy Member
In het geval die linq functies een stabiele sorteermethode gebruiken (ik gok van wel) dan moet je zo sorteren:

var sortedList = list.OrderBy(point => point.a).ThenBy(point => point.z);

Het komt misschien vreemd over, maar dan krijg je wel het resultaat dat jij wenst.

Als het geen stabiele sorteermethode is dan heb je pech en kan je die methods niet rechtstreeks gebruiken zonder zelf eerst een comparator te implementeren.

Klein stukje lectuur over stable sorting voor de liefhebbers: http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
Daar wordt trouwens ook dit 'probleem' besproken.

Edit: Blijkbaar had Tyfius al iets gelijkaardig vermeld...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan