【问题标题】:How to loop and handle matches vs nonmatches?如何循环和处理匹配与不匹配?
【发布时间】:2012-11-13 05:03:01
【问题描述】:

我有一个包含 2 列的 ListView。例如,我们会说它看起来像这样:

ColA    | ColB  
-----------------
001     |  
002     |  
003     |  
004     |  
005     |  

我有一个包含以下行的文本文件:

001  
002  
004  
005  
008  

我正在尝试逐行读取文件,如果数字与 ColumnA 中的数字匹配,我想将其添加到 ColumnB。这很好用(请参阅下面的示例)。但是,我还想将任何不匹配项添加为新的 ListViewItem。我无法弄清楚那部分。到目前为止,这是我所拥有的:

foreach (string textfileitem in TheTextFile)
{
    foreach (ListViewItem item in ListView1.Items)
    {
        var existingitem = item.SubItems[0];

        if (existingitem.Text == textfileitem)
        {
            item.SubItems[1].Text = textfileitem;
        }
    }
}

我不确定如何处理任何不匹配并将它们添加到 ListView。最终结果如下所示:

ColumnA | ColumnB
----------------- 
001     | 001
002     | 002
003     | 
004     | 004
005     | 005
-       | 008

一如既往,感谢您的帮助!

【问题讨论】:

  • 我知道您没有使用此方法,但此link 可能对您有所帮助。

标签: c# winforms listview loops


【解决方案1】:

遍历您的columnA,创建<String,YourDataSourceItem> 的字典。运行您的文件 - 使用TryGetValue 测试匹配。如果找到,设置columnB。如果没有,请创建一个新项目。

【讨论】:

  • 不幸的是,我不熟悉使用字典,但我会检查一下。谢谢!
  • “ContainsKey”可以在这里工作吗?将 ColumnA 加载到字典中,然后使用 if (dictionary.ContainsKey(textfileitem)) { //do something ? } else { //do something else } 之类的内容循环遍历文本文件
  • @Vertekal: ContainsKey 也可以,但如果项目存在,它需要两次查找,因为首先您将测试是否存在,然后检索该项目。 TryGetValue 为您节省了额外的查找时间。性能上没有太大差异,因为字典无论如何都很快,只是我使用它的风格。
  • 谢谢!我认为这会奏效。我有一个 foreach 循环,将 ColumnA 项添加到字典中。然后,我有一个遍历文本文件并执行 TryGetValue 的 foreach 循环。我不确定的唯一部分是 TryGetValue 是否为真,如何将文本文件项添加到与匹配 ColumnA 项位于同一行的 ColumnB 中。我想我需要了解更多关于 ListViewItems 的信息 .. :)
  • @Vertekal:取决于你的底层DataSource。如果是DataTable,您的TryGetValue 将检索DataRow(进入第二个参数,ByRef)。然后你会简单地说DataRow("ColumnB") = newColumnBValue(之前从文件中读取)。您不应该使用 ListViewItem 分配任何东西,而应该通过业务逻辑工作。
【解决方案2】:

这是另一种方法:

List<string> missingItems = new List<string>();
foreach (string textfileitem in TheTextFile)
{
    foreach (ListViewItem item in ListView1.Items)
    {
        var existingitem = item.SubItems[0];

        if (existingitem.Text == textfileitem)
        {
            item.SubItems[1].Text = textfileitem;
        }
        else
        {
            missingItems.Add(textfileitem);
        }
    }
}
foreach (string missingItem in missingItems)
{
    // Add missing item to your ListView.
    ListView1.Items.Add("missing").SubItems.Add(missingItem);
}

【讨论】:

  • 我尝试了类似的方法,但它错误地将项目添加到 missingItems 列表中。在第二次 foreach 循环期间,现有项目可能与 textfileitem 不匹配,直到它循环了几次。添加到 missingItems 的项目实际上可能在初始 foreach 循环的下一次传递期间匹配。我希望这是有道理的......
【解决方案3】:

我会这样做:

List<string> listItems = ListView1.Items.Select(item => item[0].ToString())  // Get list of current items
foreach (string textItem in TheTextFile.Except(listItems)) { // Get all text items that are not in the current list
// Add missing list view item
}

【讨论】:

    【解决方案4】:

    根据@Neolisk 的建议,我重新考虑了我的流程并最终使用绑定到DataTableDataGridView。 ColumnA 由DataTable 中的数据填充。然后,我将 ColumnA 中的每个项目放入 Dictionary

    我的代码现在看起来像这样:

    int count;
    Dictionary<string, int> d = new Dictionary<string, int>();
    
    foreach (DataRow dr in dataSet1.Tables["Table1"].Rows)
    {
        d.Add((string)dr[0], count);
        count++;
    }
    
    foreach (string textfileitem in TheTextFile)
    {
        string item = //specific data from textfileitem
        int value;
    
        if (d.TryGetValue(item, out value)
        {
            DataRow[] dr = dataSet1.Tables["Table1"].Select("ColumnA = " + item");
            dr[0]["ColumnB"] = item;
        }
        else
        {
            dataTable1.Rows.Add(null, item);
        }
    }
    

    至少我希望这是准确的。我试图使我的代码通用并摆脱不必要的东西。

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2019-10-11
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多