2016-11-12 5 views
1

Wie können mehrere Daten hinzugefügt werden, ohne dieselben Daten hinzuzufügen? Ich werde versucht, es zu korrigieren.Wie können mehrere Daten hinzugefügt werden, ohne dieselben Daten hinzuzufügen?

public partial class SalaryCalculator : Form 
{ 

    public SalaryCalculator() 
    { 
     InitializeComponent(); 
    } 


    public Double basicAmount, houseRent, medicalAllowance, totalHouseRent, totalMedicalAllowance, totalSalary; 
    public int id = 0; 

    private void addButton_Click(object sender, EventArgs e) 
    { 

     ListViewItem newList = new ListViewItem((++id).ToString()); 


     string employeeName = nameTextBox.Text; 

     double basicAmount = Convert.ToDouble(basicTextBox.Text); 
     double houseRent = Convert.ToDouble(houseRentTextBox.Text); 
     double medicalAllowance = Convert.ToDouble(medicalTextBox.Text); 


     totalHouseRent = (basicAmount*houseRent)/100; 
     totalMedicalAllowance = (basicAmount*medicalAllowance)/100; 
     totalSalary = basicAmount + totalHouseRent + totalMedicalAllowance; 
     totalTextBox.Text = totalSalary.ToString(); 


     newList.SubItems.Add(employeeName); 
     newList.SubItems.Add(totalSalary.ToString()); 
     listView1.Items.Add(newList); 



     } 

    } 
} 

Wie können mehrere Daten hinzufügen, ohne dass dieselben Daten hinzufügen?

+0

Verwenden Sie HashSet. http://stackoverflow.com/q/4558754/3956100 – Niklas

Antwort

0

können Sie überprüfen, ob der ListView1 den Schlüssel enthält, die Sie wollen in den:

if (!listView1.Items.ContainsKey(employeeName) && !listView1.Items.ContainsKey(totalSalary.ToString())) 
{ 
    newList.SubItems.Add(employeeName); 
    newList.SubItems.Add(totalSalary.ToString()); 
    listView1.Items.Add(newList); 
} 
0

Grundsätzlich Ihr Ansatz falsch ist, wäre ideal Weg, um eine richtige Modell betrachten werden, um die Daten zu halten, die dann gebunden werden können an die Ui-Kontrolle. Sie können dann IEquatable<T> implementieren, um Equals und GetHashCode zu überschreiben, wodurch Datenduplikation vermieden wird, wenn sie zu einer Sammlung HashSet hinzugefügt werden oder während des manuellen Vergleichs.

wäre mein Ansatz verfolgt nun:

  • die Datenmodelle erstellen wie folgt:

// Employee Modell SalaryDetail Aggregate implementiert IEquatable<Employee> die Equals und GetHashCode außer Kraft zu setzen, ein einzigartiges Objekt zu erstellen, derzeit tut es auf Basis von Name, aber mehr Elemente von SalaryDetail können hinzugefügt werden

public class Employee : IEquatable<Employee> 
{ 
    public string Name { get; set;} 

    public SalaryDetail Salary { get; set;} 

    public bool Equals(Employee other) 
    { 
     return other != null && 
       Name == other.Name; 
    } 

    public override bool Equals(object other) 
    { 
     return Equals(other as Employee); 
    } 

    public override int GetHashCode() 
    { 
     return (Name.GetHashCode() * 31); 
    } 

} 

// SalaryDetail Modell

public class SalaryDetail 
{ 
    public double BasicAmount { get; set;} 

    public double HouseRent { get; set;} 

    public double MedicalAllowance { get; set;} 

    public double TotalHouseRent { get; set;} 

    public double TotalMedicalAllowance { get; set;} 

    public double TotalSalary { get; set;} 
} 

// Hier nun wird der Code, wenn Sie einen neuen Mitarbeiter hinzufügen versuchen:

Employee employee = new Employee(); 

employee.Name = // Fill Employee Name; 

employee.Salary = new SalaryDetail(); 

// Fill various Salary components like Rent, Allowances and their calculation 

Jetzt können Sie entweder Objekt Hinzufügen der Mitarbeiter berücksichtigen zu eine Auflistung vom Typ HashTable<Employee>, die automatisch dafür sorgt, dass nur eindeutige Objekte hinzugefügt werden, da die überschriebene Methode Equals von IEquatable<Employee> aufgerufen wird, dann können Sie die Hashtable derzuweisen, da gibt es nie doppelt Mitarbeiter

Eine andere Option wäre, Sie können es auf die List<Employee>, aber vor der Zugabe können Sie überprüfen, ob das Objekt bereits existiert oder nicht, gibt es mehrere Möglichkeiten, wäre ein einfacher Code mit Find oder Any:

List<Employee> testList = new List<Employee>(); 

// mit Find var existingEmployee = testList.Find (e => e.Equals (NewEmployeeObject))

// Wenn das Ergebnis (existingEmployee) null ist, dann das Objekt hinzufügen, sonst die Mitarbeiter bereits vorhanden sind, Verfahren der Logik entsprechend

Oder

// Mit Any (erfordert System.Linq)

var isEmployeeExisting = testList.Any(e => e.Equals(NewEmployeeObject)) 

// Wenn das Ergebnis (isEmployeeExisting) wahr ist, dann das Objekt hinzufügen, sonst die Mitarbeiter bereits vorhanden ist, Verfahren der Logik entsprechend

Verwandte Themen