| 

.NET C# Java Javascript Exception

2
Hallo !
Hier meine nächtes, für mich nicht lösbare Problem. Ich weiß nicht wie ich in myArray die Zahlen auf Dopplung prüfen kann, um dann die ausgewälte Anzahl der Zahlen, nicht doppelt, auszugeben.
Beim ersten cmdAnz2..Click werden nicht doppelte Zahlen ausgegeben. Beim zweiten cmdAnz2..Click kommen genau die gleiche Zahlen wieder !? Schleifenproblem, oder ?

Hier bitte der code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Testen
{
public partial class Listfeld : Form
{
// Festlegung der Zahlen, die bei Programmstart in die Listbox geladen werden

List<Int32> myArray = new List<Int32>() {
11,26,35,44,53,62,91,88,9125,112 };

public Listfeld()
{
InitializeComponent();
}

private void cmdEnde_Click(object sender, EventArgs e)
{
// Listfeld wird beendet
Close();
}

private void Listfeld_Load(object sender, EventArgs e)
{
// die im Programm eingegebenen Zahlen werden in die Listbox geladen

foreach (Int32 value in myArray)
{
lstAnz1.Items.Add(value);
}
}

private void cmdAnz1_Click(object sender, EventArgs e)
{

}

private void cmdAnz2_Click(object sender, EventArgs e)
{

// Anzahl der Zufallszahlen

int z = (int)numAnz.Value;

// Dopplung prüfen, funktioniert noch nicht!

Random random = new Random();
int[] myArrayx = new int[99];
int variable = 0;
int indexer = 0;

while (indexer < z)
{

variable = random.Next(z);

if (myArray.Count(p => p == variable) == 0)
{
myArrayx[indexer] = variable;
indexer++;

// Ausgabefelder leeren

lstAnz2.Items.Clear();
lblAnz3.Text = "";
//for (int i = 0; i < z; i++)
for (variable = 0; variable < z; variable++)
{

// ZufallsZahlen auswählen und in Listbox laden

int seed = DateTime.Now.Millisecond;

Random randomNumber = new Random(seed);
int rndNum = randomNumber.Next(0, myArray.Count - 1);

// unformartierte Ausgabe der ausgewählten ZufallsZahlen

lstAnz2.Items.Add(myArray[variable].ToString("######"));
lblAnz3.Text += (myArray[variable]) + "\n";

Thread.Sleep(50);

}
}

}
}
private void cmdHin_Click(object sender, EventArgs e)
{
try
{
// Neue Zahlen in die Listbox hinzufügen
// Problem: Die zuletzt hinzugefügte Zahl wird nicht ausgewählt ! ???
// Vorübergehende Hilfe: 0 als letzte Zahl hinzufügen

if (string.IsNullOrEmpty(txtHinzu.Text) ||
!IsNumeric(txtHinzu.Text))
return;

{
int neu;
neu = Convert.ToInt32(txtHinzu.Text);

myArray.Add(neu);

lstAnz1.Items.Add(neu);
lstAnz1.SelectedIndex = lstAnz1.Items.Count - 1;
}
}
finally
{
txtHinzu.Text = string.Empty;
}

}

private bool IsNumeric(string str)
{
double num;
return double.TryParse(str, out num);
}

private void cmdLoesch_Click(object sender, EventArgs e)
{

// Ausgewählte Zahl aus Listbox löschen

if (lstAnz1.SelectedItem == null) return;
int zahl = (int)lstAnz1.SelectedItem;
myArray.Remove(zahl);
lstAnz1.Items.Remove(lstAnz1.SelectedItem);

}

private void txtHinzu_TextChanged(object sender, EventArgs e)
{

}

private void lstAnz1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void lblBox1_Click(object sender, EventArgs e)
{

}

private void lstAnz2_SelectedIndexChanged(object sender, EventArgs e)
{

}

}

}
21.01.2014
kannnix 61 6
3 Antworten
2
Groupen und den Count überprüfen wäre mein Vorschlag:

var unique = myArray.GroupBy(x => x).Where(g => g.Count == 1);

Ausgangsliste:
1
2
2
3
4
5
5
5
6

Nach dem Groupen
.GroupBy(x => x)

Value | Count
-----------------
1 ....... 1
2 ....... 2
3 ....... 1
4 ....... 1
5 ....... 3
6 ....... 1

Nach dem Where
.Where(g => g.Count == 1)

Key | Count
-----------------
1 ....... 1
3 ....... 1
4 ....... 1
6 ....... 1


Weiter gehts nun mit
.Select(g => g.Key)

1
3
4
6


Und ein Simples ToList() oder ToArray() kannst du optional auch noch dran hängen.

Zusammengefasst:
var unique = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();


In deinem Code müsste das dann so aussehen (glaube ich):

var grouped = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();
while (indexer < z)
{
variable = random.Next(z);
if (grouped .Count(p => p == variable) == 0)
{
//...
21.01.2014
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Gleich mit LINQ überfordern. :-)
lbm1305 21.01.2014
Richtig: Wie in meinem Profil beschrieben, bin ich mit dieser Antwort überfordert. Hilft aber bestimmt anderen, mit ähnlichem Problem.
Ich lerne gerne mit fuktionsfähigen Beispielen, und versuche dann Schritt für Schritt zu verstehen.
kannnix 21.01.2014
Wenn du Frage dazu hast erklär ichs auch gerne .. Grüße
Floyd 21.01.2014
In die Luft geschossen .Distinct() gefällt euch nicht?
cybere 21.01.2014
1
@cybere: Nein :) Distinct lässt jedes Element einer Liste genau einmal drin egal wie häufig es vorkommt (entsprich also einem reinen GroupBy). Ziel ist es aber die Elemente zu ermitteln die nur einmal vorkommen.
Floyd 22.01.2014
Also vielen Dank für die bisherigen Beiträge!
Thema:
Bereits mit Programmstart geladene Zahlen können mittels "cmdHin_Click" um weitere Zahlen ergänzt werden oder es werden mittels "cmdLoesch_Click" vorgegebene Zahlen gelöscht. Aus diesen im Array enthaltenen Zahlen sollen mittels "numAnz" z -Zahlen aus dem Array ausgewählt werden und nicht doppelt ausgegeben werden.
Meine bisherigen Versuche sind gescheitert weil ich nicht verstehe, wie ich diese Prüfung (Dopplung) erfolgreich durchführen kann.
kannnix 22.01.2014
1
Wie meine Lösung bereits beschreibt, kannst du die Zahlen Groupen (dh. jede Zahl ist nur einmal in der Ergebnisliste drin und zusätzlich hast du eine Anzahl wie oft die Zahl zusammengefasst wurde (den Count)). Nun kannst du den Count überprüfen ob er 1 ist. Ich erweitere meine Antwort um ein Beispiel.
Floyd 22.01.2014
1
So Bearbeitung abgeschlossen. Hab es gleich mal in deinen Code eingebaut. Ist es das was du suchst?
Floyd 22.01.2014
0
Floyd vielen Dank für die wirklich große Mühe, die du dir mit mir machst.
Aber es funktioniert auch nicht mit dem von dir vorgeschlagenen code.
Wobei ich glaube, dass es in meinem code nun einen grundlegenden Fehler gibt, den ich aber nicht erkenne weil ich diesen voller Unkenntnis hingezaubert habe, hm?
Das Programm zeigt keinen Fehler, läuft einfach nur auf, wenn ich aus diesem, welches so nicht läuft:
var grouped = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();

dieses mache:
()
var grouped = myArray.GroupBy(x => x).Where(g => g.Count() == 1).Select(g => g.Key).ToList();


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Testen
{
public partial class Listfeld : Form
{
// Festlegung der Zahlen, die bei Programmstart in die Listbox geladen werden

List<Int32> myArray = new List<Int32>() {
11,26,35,44,53,62,91,88,9125,112 };

public Listfeld()
{
InitializeComponent();
}

private void cmdEnde_Click(object sender, EventArgs e)
{
// Listfeld wird beendet
Close();
}

private void Listfeld_Load(object sender, EventArgs e)
{
// die im Programm eingegebenen Zahlen werden in die Listbox geladen

foreach (Int32 value in myArray)
{
lstAnz1.Items.Add(value);
}
}

private void cmdAnz1_Click(object sender, EventArgs e)
{

}

private void cmdAnz2_Click(object sender, EventArgs e)
{

// Anzahl der Zufallszahlen

int z = (int)numAnz.Value;

// Dopplung prüfen, funktioniert noch nicht!

Random random = new Random();

int variable = 0;
int indexer = 0;

var grouped = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();

while (indexer < z)
{
variable = random.Next(z);
if (grouped.Count(p => p == variable) == 0)
{

// Ausgabefelder leeren

lstAnz2.Items.Clear();
lblAnz3.Text = "";
//for (int i = 0; i < z; i++)
for (variable = 0; variable < z; variable++)
{

// ZufallsZahlen auswählen und in Listbox laden

int seed = DateTime.Now.Millisecond;

Random randomNumber = new Random(seed);
int rndNum = randomNumber.Next(0, myArray.Count - 1);

// unformartierte Ausgabe der ausgewählten ZufallsZahlen

lstAnz2.Items.Add(myArray[variable].ToString("######"));
lblAnz3.Text += (myArray[variable]) + "\n";

Thread.Sleep(50);

}
}

}

}
private void cmdHin_Click(object sender, EventArgs e)
{
try
{
// Neue Zahlen in die Listbox hinzufügen
// Problem: Die zuletzt hinzugefügte Zahl wird nicht ausgewählt ! ???
// Vorübergehende Hilfe: 0 als letzte Zahl hinzufügen

if (string.IsNullOrEmpty(txtHinzu.Text) ||
!IsNumeric(txtHinzu.Text))
return;

{
int neu;
neu = Convert.ToInt32(txtHinzu.Text);

myArray.Add(neu);

lstAnz1.Items.Add(neu);
lstAnz1.SelectedIndex = lstAnz1.Items.Count - 1;
}
}
finally
{
txtHinzu.Text = string.Empty;
}

}

private bool IsNumeric(string str)
{
double num;
return double.TryParse(str, out num);
}

private void cmdLoesch_Click(object sender, EventArgs e)
{

// Ausgewählte Zahl aus Listbox löschen

if (lstAnz1.SelectedItem == null) return;
int zahl = (int)lstAnz1.SelectedItem;
myArray.Remove(zahl);
lstAnz1.Items.Remove(lstAnz1.SelectedItem);

}

private void txtHinzu_TextChanged(object sender, EventArgs e)
{

}

private void lstAnz1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void lblBox1_Click(object sender, EventArgs e)
{

}

private void lstAnz2_SelectedIndexChanged(object sender, EventArgs e)
{

}

}

}
22.01.2014
kannnix 61 6
Kannst du mir eine Solution zusammenstellen die lauffähig ist und mir zur verfügung stellen?.
Floyd 24.01.2014
0
Hier bitte,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Testen
{
public partial class LottTest : Form
{
public LottTest()
{
InitializeComponent();
}

private void cmdEnde_Click(object sender, EventArgs e)
{
Close();
}

// ******************************************************************************
// Prüfung auf Dopplung und Sortierung funktioniert !!
// ******************************************************************************

private void cmdStart_Click(object sender, EventArgs e)
{

{

Random random = new Random();
int[] myArray = new int[9];

int variable = 0;
int indexer = 0;

string format;
string ausgabe;

while (indexer < 6)
{

variable = random.Next(1, 50);

if (myArray.Count(p => p == variable) == 0)
{

myArray[indexer] = variable;
indexer++;

}

}

lstA.Items.Clear();
format = "{0,2:##}";

for (variable = 0; variable < 6; variable++)
{

ausgabe = String.Format(format, myArray[variable]);
lstA.Items.Add(ausgabe);

}
}
}

private void cmdFrzuf_Click(object sender, EventArgs e)
{

int x = (int) numKlza.Value;
int y = (int) numGrza.Value;
int z = (int) numAnzza.Value;

if (y <= x)
{
MessageBox.Show("Bitte Eingabe prüfen! Größte Zahl zu klein!", "Achtung! Fehler!",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

else

if (z >= (y - x))
{
MessageBox.Show("Bitte Eingabe prüfen! Nicht genügend Zahlen zur Auswahl?!", "Achtung! Fehler!",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

else

{

Random random = new Random();
int[] myArray = new int[99];

int variable = 0;
int indexer = 0;

string format;
string ausgabe;

while (indexer < z)
{

variable = random.Next(x, y);

if (myArray.Count(p => p == variable) == 0)
{

myArray[indexer] = variable;
indexer++;

}

}

lstFrzuf.Items.Clear();
//lblFrzuf.Text = " ";
format = "{0,7:#,###}";

for (variable = 0; variable < z; variable++)
{

ausgabe = String.Format(format, myArray[variable]);
lstFrzuf.Items.Add(ausgabe);
//lblFrzuf.Text += ausgabe + "\n";
}
}
}

private void textBox3_TextChanged(object sender, EventArgs e)
{

}

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{

}

private void LottTest_Load(object sender, EventArgs e)
{

}
}
}
24.01.2014
kannnix 61 6
"Prüfung auf Dopplung und Sortierung funktioniert !!" heist das du bist bereits fertig?

Ich meinte eher ein ZIP mit ner .SLN oder .csproj Datei. Der .designer.cs etc. .. also lauffähig
Floyd 24.01.2014
"Prüfung auf Dopplung und Sortierung funktioniert !!" heist das du bist bereits fertig?

In dem lauffähigen code funktioniert dies. In meinem Problemcode noch nicht.
kannnix 25.01.2014

Stelle deine .net-Frage jetzt!