C# 为什么在循环中复制第一个匹配?

C# 为什么在循环中复制第一个匹配?,c#,datatable,C#,Datatable,我有两个名为tableFileTemp2和tableFile的表。我需要一个不同的计算机列表,将路径和文件列合并到表格文件表格路径列中 tableFileTemp2//源代码 +-------+----------+--------+-------+ | host | path | date | file | +-------+----------+--------+-------+ | comp1 | c:\ | xydate | x.exe | | comp1 |

我有两个名为
tableFileTemp2
tableFile
的表。我需要一个不同的计算机列表,将
路径
文件
列合并到
表格文件
表格
路径
列中

tableFileTemp2
//源代码

+-------+----------+--------+-------+
| host  |   path   |  date  | file  |
+-------+----------+--------+-------+
| comp1 | c:\      | xydate | x.exe |
| comp1 | c:\Temp\ | xydate | x.exe |
| comp2 | c:\win\  | xydate | y.exe |
| comp2 | c:\win\  | xydate | z.exe |
+-------+----------+--------+-------+
tableFile
//这就是结果,显然第一个路径+文件对每台机器都是重复的

+-------+---------------------------------------------------+--------+------+
| host  |                     path                          |  date  | file |
+-------+---------------------------------------------------+--------+------+
| comp1 | c:\x.exe<br>c:\x.exe<br>c:\Temp\x.exe<br>         | xydate | null |
| comp2 | c:\win\y.exe<br>c:\win\y.exe<br>c:\win\z.exe<br>  | xydate | null |
+-------+---------------------------------------------------+--------+------+
我的代码:

for (int s = 0; s < tableFileTemp2.Rows.Count; s++)
{
    if (tableFile.Rows.Count != 0)
    {
        for (int t = 0; t < tableFile.Rows.Count; t++)
        {
            if (string.Equals(tableFile.Rows[t][0].ToString(), tableFileTemp2.Rows[s][0].ToString(), StringComparison.OrdinalIgnoreCase))
            {
                tableFile.Rows[t][1] = tableFile.Rows[t][1].ToString() + tableFileTemp2.Rows[s][1].ToString() + tableFileTemp2.Rows[s][3].ToString() + "<br>";
                break;
            }
            else if (t == (tableFile.Rows.Count - 1))
            {
                tableFile.Rows.Add(tableFileTemp2.Rows[s][0].ToString(), (tableFileTemp2.Rows[s][1].ToString() + tableFileTemp2.Rows[s][3].ToString() + "<br>"), tableFileTemp2.Rows[s][2], null);
            }
        }
    }
    else
    {
        tableFile.Rows.Add(tableFileTemp2.Rows[s][0].ToString(), (tableFileTemp2.Rows[s][1].ToString() + tableFileTemp2.Rows[s][3].ToString() + "<br>"), tableFileTemp2.Rows[s][2], null);
    }
}
for(int s=0;s”;
打破
}
else if(t==(tableFile.Rows.Count-1))
{
tableFile.Rows.Add(tableFileTemp2.Rows[s][0].ToString(),(tableFileTemp2.Rows[s][1].ToString()+tableFileTemp2.Rows[s][3].ToString()+“
”,tableFileTemp2.Rows[s][2],null); } } } 其他的 { tableFile.Rows.Add(tableFileTemp2.Rows[s][0].ToString(),(tableFileTemp2.Rows[s][1].ToString()+tableFileTemp2.Rows[s][3].ToString()+“
”,tableFileTemp2.Rows[s][2],null); } }
正如您在评论中所说,您仍然拥有数据来源的原始CSV。我们可以用LINQ来做这件事

+-------+----------+--------+-------+
| host  |   path   |  date  | file  |
+-------+----------+--------+-------+
| comp1 | c:\      | xydate | x.exe |
| comp1 | c:\Temp\ | xydate | x.exe |
| comp2 | c:\win\  | xydate | y.exe |
| comp2 | c:\win\  | xydate | z.exe |
+-------+----------+--------+-------+
然后代码看起来像

var results =
    from thing in
        (from line in tableFileCSV.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)
         let row = line.Split(',')
         select new
         {
             Host = row[0],
             Path = row[1] + row[3] + "</br>",
             Date = row[2],
             File = row[3] // <- Are you sure you want this to be null and not the file value?
         })
    group new { thing.Path, thing.Date, thing.File } by new { thing.Host } into g
    select new
    {
        Host = g.Key.Host,
        Path = g.Select(i => i.Path).Aggregate((a, b) => a + b),
        Date = g.Select(i => i.Date).FirstOrDefault(),
        File = "File",
    };

// If you want to get a look at it.
foreach (var item in results)
{
    Console.WriteLine("{0} {1} {2} {3}", item.Host, item.Path, item.Date, item.File);
}

请在标题中添加直接问题或问题解释,并在正文和/或标签中添加您正在使用的数据库技术。您将得到更好的响应。我将数据从csv文件添加到数据表中,因此后面没有数据集。你能建议一个问题作为描述这一点的标题吗?这听起来像是对两个CSV数据集的
join
操作(可能这就是你的标题)。这是你最初的问题,也许试着寻找答案。如果您可以访问CSV,则可能根本不需要将数据注入数据表中:)我已经试图找到一个解决方案,但老实说,我很好奇为什么我上面的代码无法返回我期望的数据。所以我的问题不是我如何解决我的问题,而是为什么我的方法不起作用。看起来你在嵌套循环、嵌套数组地狱中迷失了方向。。。这一切都很令人困惑。但我将尝试使用您的方法构建一个dotnetfiddle。哦,不幸的是,我的tableFileTemp2 dataTable不包含来自原始csv的数据。它已经被修改了很多次。因此,只有将表保存为csv,然后再次读取,这才有效。但是就像我说的,尽管我真的很感谢你的帮助,我仍然很好奇为什么我的代码会失败。这段代码将适用于原始的CSV文件。或者,用DataTable替换内部select,并访问行的列值,而不是按索引访问元素。这可能更好,因为可以通过名称访问列。如果你对我的代码还有任何问题,就问吧。进展如何?你离解决方案更近了吗?没有。就像我说的,我的原始CSV包含不同的数据,在不同的结构中。tableFileTemp2 table已经是前面几个步骤的输出。嗯,如果没有看到您的全部代码,这是很困难的。那么我建议。考虑你的初始变量,想想你想去哪里。读一读,然后再问这个问题。如果你在…中创建一个你的问题的例子,这会有很大帮助。。。你永远不知道,也许使用伪REPL会帮你解决问题!
var results =
    from thing in
        (from line in tableFileCSV.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)
         let row = line.Split(',')
         select new
         {
             Host = row[0],
             Path = row[1] + row[3] + "</br>",
             Date = row[2],
             File = row[3] // <- Are you sure you want this to be null and not the file value?
         })
    group new { thing.Path, thing.Date, thing.File } by new { thing.Host } into g
    select new
    {
        Host = g.Key.Host,
        Path = g.Select(i => i.Path).Aggregate((a, b) => a + b),
        Date = g.Select(i => i.Date).FirstOrDefault(),
        File = "File",
    };

// If you want to get a look at it.
foreach (var item in results)
{
    Console.WriteLine("{0} {1} {2} {3}", item.Host, item.Path, item.Date, item.File);
}
var dt = new DataTable();
dt.Columns.Add("Host"); 
dt.Columns.Add("Path"); 
dt.Columns.Add("Date"); 
dt.Columns.Add("File"); 
foreach (var item in results) 
{   
    dt.Rows.Add(item.Host,item.Path,item.Date,item.File);                 
}