用文本框中的数字和文本框作为关键字填充字典

本文关键字:文本 关键字 字典 填充 数字 | 更新日期: 2023-09-27 17:58:07

我正在编写一段代码,希望将多个TextBox控件中的数字获取到一个集合中。对其进行排序,然后更改包含前3个最高值的文本框的背景色。这是字典

Dictionary<System.Windows.Forms.TextBox, string> all_cycles = new Dictionary<System.Windows.Forms.TextBox, string>(10);
for (var i = 1; i < 5; i++)
{
    all_cycles.Add(((System.Windows.Forms.TextBox)this.Controls.Find("txtendc" + Convert.ToString(i), true)[0]),this.Text);
}

我知道用"this.text"我不会得到文本框的值,所以这就是我问的原因。我还尝试创建一个数组,它只包含文本框的值,然后我用这些值来填充字典。但它总是会丢弃一个超出数组界限的索引。或者索引超出范围异常。这将删除超出范围的异常:

List<System.Windows.Forms.TextBox> txtendc = new List<System.Windows.Forms.TextBox>(10);
for (var i = 1; i < 5; i++)
{
    txtendc.Add((System.Windows.Forms.TextBox)this.Controls.Find("txtendc" + Convert.ToString(i), true)[0]);
}
int[] endc_content = new int[10];
for (var i = 1;i < 5; i++)
{
    endc_content[i]= int.Parse(txtendc[i].Text);
}

我对颜色没有任何问题,只是把字典填满了。如果你有比字典集更好的解决方案,请告诉我。感谢

编辑:如果有任何重要的事情,整个代码都在计时器滴答事件中。

用文本框中的数字和文本框作为关键字填充字典

当您实例化类时,我会在代码背后创建一个所有TextBoxes的列表。然后你可以用林克拿到前三名。请记住,您需要确认所有文本框都包含数字——确保在其中一个文本框中输入文本时程序不会崩溃。如果表单中的所有文本框都将包含这些数字,则可以使用以下方法进行验证和排序(未经测试):

private List<TextBox> myTextBoxes { get; set; }
public Form1()
{
    InitializeComponent();
    foreach (Control c in this.Controls)
    {
        if (c.GetType() == typeof(TextBox))
            myTextBoxes.Add((TextBox)c);
    }
}
private IEnumerable<TextBox> getTop3()
{
    return myTextBoxes.Where(tb => tb.Text.AsEnumerable().All(char.IsDigit)).Select(tb => tb).OrderByDescending(tb => Double.Parse(tb.Text)).Take(3);
}

Linq查询的第一步将文本转换为可枚举的char,并确保所有字符都包含数字(而不是字母)。第二个选择这些文本框。第三种方法将它们解析为双打,并将它们进行比较,第一个是最高的数字。最后一个取列表中的前三个(包含最高3个数字的文本框)

编辑:根据您的意见,代码可以简化为:

public Form1()
{
    InitializeComponent();
}
private IEnumerable<TextBox> getTop3(string textboxPrefix)
{
    List<TextBox> textBoxesToSort = new List<TextBox>();
    foreach (Control c in this.Controls)
        if (c.GetType() == typeof(TextBox) && c.Name.StartsWith(textboxPrefix))
            textBoxesToSort.Add((TextBox)c);
    return textBoxesToSort.OrderByDescending(tb => Double.Parse(tb.Text)).Take(3);
}

您可以根据值对TextBox控件进行排序,然后从列表中选择前3个:

var result = this.Controls.OfType<TextBox>().Select(x =>
                 {
                     try { return new { Key = x, Value = Convert.ToInt32(x.Text) }; }
                     catch { return null; }
                 })
                 .Where(x=>x!=null)
                 .OrderByDescending(x => x.Value)
                 .Take(3)
                 .ToDictionary(x => x.Key, x => x.Value);

要测试结果,显示一个包含值的消息框:

MessageBox.Show(string.Join("'n",
    result.Select((x, i) => string.Format("{0}:{1}", i+1, x.Value))));

以上示例将应用于任何TextBox控件列表,仅举个例子,我使用了表单中的所有TextBox控件。

请尝试一下,希望它能有所帮助:

List<System.Windows.Forms.TextBox> all_cycles = new List<System.Windows.Forms.TextBox>(10);
        int[] indexOfTextBox = new int[3];
        foreach(var cycle in all_cycles)
        {
            int value = Convert.ToInt16(cycle.Text);
            if (value > indexOfTextBox[0])
            {
                indexOfTextBox[0] = value;
            }
            else if (value > indexOfTextBox[1])
            {
                indexOfTextBox[1] = value;
            }
            else if (value > indexOfTextBox[2])
            {
                indexOfTextBox[2] = value;
            }
        }
        all_cycles[indexOfTextBox[0]].BackColor = ConsoleColor.Red;
        all_cycles[indexOfTextBox[1]].BackColor = ConsoleColor.Blue;
        all_cycles[indexOfTextBox[2]].BackColor = ConsoleColor.Green;