数据表中显示的“重复”数据

时间:2019-03-11 07:41:00

标签: c# list winforms datatable

我想以另一种形式在List<string>中显示我的datatable。来自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();
    }

1 个答案:

答案 0 :(得分:0)

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

无论如何,您说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,
    });

如果删除所有注释,您会发现它确实是一小段代码。

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

SelectMany”将执行您的foreach inside foreach

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

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

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