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)
{
}
}
}
|
var unique = myArray.GroupBy(x => x).Where(g => g.Count == 1);
1
2
2
3
4
5
5
5
6
.GroupBy(x => x)
Value | Count
-----------------
1 ....... 1
2 ....... 2
3 ....... 1
4 ....... 1
5 ....... 3
6 ....... 1
.Where(g => g.Count == 1)
Key | Count
-----------------
1 ....... 1
3 ....... 1
4 ....... 1
6 ....... 1
.Select(g => g.Key)
1
3
4
6
var unique = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();
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)
{
//...
|
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
|
||
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
|
var grouped = myArray.GroupBy(x => x).Where(g => g.Count == 1).Select(g => g.Key).ToList();
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)
{
}
}
}
|
Kannst du mir eine Solution zusammenstellen die lauffähig ist und mir zur verfügung stellen?.
– Floyd 24.01.2014
|
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)
{
}
}
}
|
"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
|