【问题标题】:“Repeated” data displayed in datatable数据表中显示的“重复”数据
【发布时间】:2019-08-01 11:46:56
【问题描述】:

我想以datatable 显示我的List<string>,来自另一种形式。来自List<string> 的数据来自textboxcombobox。但是,来自textbox 的数据永远不会重复,但combobox 可能与之前显示的数据相似。如果发生这种情况,datatable 中显示的数据将被“重复”(我不确定如何描述它)。 Here 是实际结果。我希望看到我显示的数据类似于this。以下是我的代码:

Transavestate - 保存我的列表的类

public static List<string> transnumber_list = new List<string>();
public static List<string> combos_list = new List<string>();

Form1 - 用户输入文本框和组合框值的表单

private void button1_Click(object sender, EventArgs e)
{
 //Save values in the List
 Transavestate.transnumber_list.Add(Textbox1.Text)
 Transavestate.combos_list.Add(comboBox2.SelectedItem.ToString());

 //Go to Form 2
 this.Hide();
 Form2 f2 = new Form2 ();
 f2.Show();
}

Form2 - 显示文本框和组合框值的表单

private DataSet ds;
private DataTable dt;

    //Method to insert data into dtg1
    private void CreateDataSet()
    {
        ds = new DataSet();
        dt = new DataTable("Vehicle Number");
        dt.Columns.Add("Column 1", typeof(string));
        dt.Columns.Add("Column 2", typeof(string));

        foreach (var item in Transavestate.transnumber_list)
        {
            foreach (var items in Transavestate.combos_list)
            {
                dt.Rows.Add(item, items);
            }
        }

        ds.Tables.Add(dt);
        this.dataGridView1.DataSource = dt;
        dataGridView1.AllowUserToAddRows = false;
   }

    //To run the method
    private void dataGridView1_VisibleChanged(object sender, EventArgs e)
    {
        CreateDataSet();
    }

    //Go back to Form1
    private void button2_Click(object sender, EventArgs e)
    {
        this.Hide();
        Form1 f1 = new Form1();
        f1.Show();
    }

【问题讨论】:

    标签: c# list winforms datatable


    【解决方案1】:

    在我看来,您有两个字符串序列:transNumbers 序列和 comboItems 序列(实际上它们是您的 transnumber_list 和您的 combos_list,但我不想将自己限制在事实上它们是Lists,并且名称不一致(第一个是非复数,第二个是复数?)

    无论如何,您说您的transNumbers 序列仅包含唯一项,但您的comboItems 可能包含重复项(基于某些字符串相等比较器)

    类似这样的:

    IEnumerable<string> transNumbers = new string[] {"1", "2"};
    IEnumerable<string> comboItems = new string[] {"A", "A", "A", "B", "A", "B"};
    

    因此你想要这样的东西:

    TransNumber ComboItem
        "1"        "A"
        "1"        "B"
        "2"        "A"
        "2"        "B"
    

    因此,您希望将每个 TransNumber 与每个唯一的 comboItem 组合在一起。顺序似乎并不重要。

    使用 LINQ 这很容易。我们将使用Enumerable.SelectMany 组合这两个序列,我们将使用Enumerable.Distinct 删除您的重复项

    // SelectMany:
    // parameter source: transNumbers
    // parameter collectionSelector: comboItems without Duplicates
    var transNumberCombiItemCombinations = transNumbers.SelectMany(
    
        // collectionSelector: comboItems without duplicates
        combiItems.Distinct(),
    
        // ResultSelector, take a transNumber from the source,
        // and a comboItem from collectionSelector to make a new object
        (transNumber, comboItem => new
        {
            Column1 = transNumber,
            Column2 = comboItem,
        });
    

    如果你把所有的cmets都去掉,你会发现它真的是一小段代码。

    Distinct 将删除重复项。如果您认为“myname”和“MYNAME”相等,则需要提供IEqualityComparer&lt;string&gt;,例如StringComparer.OrdinalIgnoreCase

    SelectMany" 会做你的foreach inside foreach

    resultSelector 将采用一个transNumber 和一个comboItem 作为输入来创建您想要的输出。在这种情况下,一个对象具有两个属性:Column1Column2

    结果是一个 IEnumerable。您所要做的就是将其枚举到列表或其他内容中并将结果添加到您的行集合中:

    dt.Rows.AddRange(transNumberCombiItemCombinations.ToList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多