遍历列表&遍历DataTable以产生结果?

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
首先,我不确定这是否是最好的方法。

我已从Excel导入数据以创建DataTable。然后,我需要解析数据输入并创建(小L)项目列表。

然后,我想检查其中是否有任何项出现在DataTable中,如果存在,请从其他列中产生输出。

我创建了一个清单<string>对于已解析的项目,并且一直在尝试找出如何遍历DataTable和遍历List来查找每个项目。

我有点到了这一步,但我知道在很多级别上这都是错误的。

C#:
List<string> finalResult = new List<string>();

//code to fill the list

foreach (DataRow row in table.Rows)
{
    int i;
    for (i = 0; i < finalResult.Count; i++)
    {
        if (row.ToString() == finalResult[i].ToString())
        {
            itemsFoundTB.Text += row.ToString();
        }
}

我认为这是IF声明,我无法理解这个概念。例如,我知道row.ToString()只是给我一个System.Data响应,而不是该行的内容。我知道finalResult [i] .ToString()似乎并没有给我任何东西。

我刚精疲力尽,那是凌晨2点,我的大脑被炸了,以为也许在这里写出来会有所帮助-实际上有时会有所帮助,只写出问题有时可以帮助理解问题..但这次不是,但没有帮助。

因此,任何指针都将不胜感激。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我知道finalResult [i] .ToString()似乎并没有给我任何东西
Since finalResult is a List<string>, there is no real point in calling ToString() on a 串. Just check against finalResult[i].
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我知道row.ToString()只是给我一个System.Data响应,而不是该行的内容
正确。那是徒劳的。

更好的方法是使用三重嵌套循环。用伪代码:
C#:
foreach(var row in dataTable.Rows)
{
    foreach(var column in dataTable.Columns)
    {
        var cellValue = row[column].ToString();

       foreach(var result in finalResult)
       {
            if (result == cellValue)
                DoSomethingToMatchingCell(cellValue);
       }
    }
}
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
当我疲惫的把头放在柔软的枕头*咳嗽*上时,确实让我感到震惊,我应该遍历清单了吗?并检查桌子...

因此,还不认为这是我早上喝咖啡的方法,而是:

C#:
foreach (var result in finalResult)
{
    if(table.Row.Contains(result))
    {
        //do something with matching cell
    }
}

只需敲定正确的语言-在发布之前应完整阅读您的帖子-您已经使我走上了正确的道路...感谢稍后将对此进行更深入的探讨。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
当我疲惫的把头放在柔软的枕头*咳嗽*上时,确实让我感到震惊,我应该遍历清单了吗?并检查桌子...

因此,还不认为这是我早上喝咖啡的方法,而是:

C#:
foreach (var result in finalResult)
{
    if(table.Row.Contains(result))
    {
        //do something with matching cell
    }
}

只需敲定正确的语言-在发布之前应完整阅读您的帖子-您已经使我走上了正确的道路...感谢稍后将对此进行更深入的探讨。
原则上很好。 @跳伞 首先从表中获取了值,然后检查了它是否在列表中,但是您当然可以用其他方法进行处理。这段无效的代码行中包含很多逻辑:
C#:
if(table.Row.Contains(result))
什么 you could do is write a method that takes a single value and then searches the DataTable for it, e.g.
C#:
private bool IsInTable(string value)
{
    // ...
}
然后,如果代码调用该方法,那么代码就有意义:
C#:
foreach (var result in finalResult)
{
    if (IsInTable(result))
    {
        //do something with matching cell
    }
}
Now you just have to actually implement that method but at least you can do that without consideration of your list, so you have simplified the problem. Inside that method, you could loop through the rows of the table and then call a method that searches a single DataRow for a value and you have simplified the problem yet again.

This is how you should approach programming problems: break it down into its constituent parts and address each part separately. If you write a method for each part then you can actually call one of those methods somewhere without having provided an implementation and the calling code will still compile. You can just assume that the method works and defer working on it until later. Each method becomes quite elementary to implement, e.g. IsInTable might look like this:
C#:
private bool IsInTable(string value)
{
    foreach (DataRow row in myDataTable.Rows)
    {
        if (IsInRow(value, row))
        {
            return true;
        }
    }
    
    return false;
}
Simple, right? Now you can independently work on that IsInRow method at your leisure. In the meantime, you could just have it return literal values true and false to test how the rest of the code behaves in those cases.
 
最佳 底部