1

私のプログラムにはテキストボックスとリストビューがあり、情報はテキストボックスに入力され、ボタンをクリックするだけでリストビューに表示されます。情報は、ID、名、姓、および年収です。情報は配列に格納されます。

給料が一番安い人を見つけたいです。どうすればこれを行うことができますか?(C#)

これは私の Form1 です:

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


    namespace Employee_Program
    {
        public partial class Form1 : Form
        {


            public Form1()
            {
        em = new ArrayList();
        InitializeComponent();
    }

    public ArrayList em = new ArrayList();


    private void show_employee()
    {
        listView1.Items.Clear();
        foreach(Employee a in em)
        {
            int i = listView1.Items.Count;
            listView1.Items.Add(a.EmployeeId.ToString());
            listView1.Items[i].SubItems.Add(a.FirstName);
            listView1.Items[i].SubItems.Add(a.LastName);
            listView1.Items[i].SubItems.Add(a.YearSalary.ToString());


        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Employee a = new Employee();
        a.EmployeeId = float.Parse(employeeId.Text);
        a.FirstName = firstName.Text;
        a.LastName = lastName.Text;
        a.YearSalary = float.Parse(yearSalary.Text);
        em.Add(a);
        show_employee();


    }

    private void button2_Click(object sender, EventArgs e)
    {

    // this is the button that will return the lowest salary value. Preferably in a                        
    //message box? Any idea?

        }
    }}

これは私のクラス、従業員です:

       using System;
       using System.Collections.Generic;
       using System.Linq;
       using System.Text;

       namespace Employee_Program
       {
class Employee
{
    protected float employeeId;
    protected string firstName;
    protected string lastName;
    protected float yearSalary;


    // first constructor
    public Employee()
    {
        employeeId = 0;
        firstName = "";
        lastName = "";
        yearSalary = 0;
    }

    // second constructor
    public Employee(float EmployeeId, string FirstName,
                           string LastName, float YearSalary) 
    {
        employeeId = EmployeeId;
        firstName = FirstName;
        lastName = LastName;
        yearSalary = YearSalary;
    }

    public float EmployeeId
    {
        get
        {
            return employeeId;
        }

        set
        {
            employeeId = value;
        }
    }

    public string FirstName
    {
        get
        {
            return firstName;
        }

        set
        {
            firstName = value;
        }
    }
    public string LastName
    {
        get
        {
            return lastName;
        }

        set
        {
            lastName = value;
        }
    }

    public float YearSalary
    {
        get
        {
            return yearSalary;
        }

        set
        {
            yearSalary = value;
        }
    }


           }

       }
4

4 に答える 4

2

注:必ず以下を含めてください。

using System.Linq;

次のような LINQ 式を使用できます。

Employee[] employees;
//Populate employees   
var min = (from e in employees select e.YearSalary).Min();
于 2012-04-16T23:57:11.293 に答える
2

MoreLINQには MinBy メソッドがあります。MinBy を使用したくない場合は、いくつかの方法があります。このアプローチをお勧めします:

// Don't use an ArrayList, use a List<Employee>
Employee minEmp = employees.Aggregate(float.MinValue, (min, e) => (e.YearSalary < min.YearSalary) ? e : min);

最低給与が一致するすべての従業員のリストが必要な場合は、次のようにすることができます。

float min = employees.Min(e => e.YearSalary);
var minEmps = employees.Where(e => e.YearSalary == min);
于 2012-04-17T00:16:33.287 に答える
1

コードのリファクタリングについて検討してください。

  • チェーンコンストラクターを使用して、初期化の重複を回避できます
  • 自動プロパティを使用できます
  • floatをidとして使用するのは非常に奇妙です。intのようなものを使用することを検討してください
  • 通常、パラメータの命名に使用されるキャメルケース
  • 給与に10進タイプを使用することを検討してください

Employeeクラスがよりクリーンになりました。

public class Employee
{   
    public Employee()
        : this(0, "", "", 0)
    {
    }

    public Employee(int employeeId, string firstName,
                           string lastName, decimal yearSalary) 
    {
        EmployeeId = employeeId;
        FirstName = firstName;
        LastName = lastName;
        YearSalary = yearSalary;
    }

    public int EmployeeId  { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set;}
    public decimal YearSalary { get; set; }
}
  • 数値入力にNumericUpDownコントロールを使用することを検討してください
  • コントロールにわかりやすい名前を使用することを検討してください
  • すべての従業員をリロードするのではなく、listViewの最後に新しい従業員を追加することを検討してください
  • 従業員の収集に汎用リストを使用することを検討してください
  • 通常、メソッドの命名に使用されるPascalCase

Form1コードは次のとおりです。

private List<Employee> employees = new List<Employee>();

private void ShowEmployee(Employee employee)
{
    var item = employeeListView.Items.Add(employee.EmployeeId.ToString());
    item.SubItems.Add(employee.FirstName);
    item.SubItems.Add(employee.LastName);
    item.SubItems.Add(employee.YearSalary.ToString());
}

private void AddEmployeeButton_Click(object sender, EventArgs e)
{
    Employee employee = new Employee();
    employee.EmployeeId = (int)idNumericUpDown.Value;
    employee.FirstName = firstNameTextBox.Text;
    employee.LastName = lastNameTextBox.Text;
    employee.YearSalary = salaryNumericUpDown.Value;
    employees.Add(employee);
    ShowEmployee(employee);
}

private void LowestSalaryButton_Click(object sender, EventArgs e)
{
    decimal minSalary = employees.Min(em => em.YearSalary);
    MessageBox.Show(minSalary.ToString("C"), "Min salary");
} 
于 2012-04-17T01:03:31.410 に答える
1

MinBy拡張メソッドの使用を検討してください。Linq には特に欠けています。実装はここにあります。

次に、次のようにします。

Employee aCheapEmployee = employees.MinBy(e => e.Salary);

最低賃金の従業員をすべて検索する必要がある場合:

var minSalary = employees.Min(e => e.Salary); 
IEnumerable<Employee> slaveLabourers = employees.Where(e => e.Salary==minSalary);
于 2012-04-17T00:07:22.560 に答える