根据索引(行号)更新其他列表中的列表

时间:2017-07-20 18:00:10

标签: c# winforms

我认为这与this非常相似,但是,我需要基于相同的索引。

我有一个这样的清单:

  Time   | Temp1 | Temp2 |  Type

10:42:00 |  108  |  150  | Unkwon 

10:44:00 |  107  |  160  | Test

10:46:00 |  108  |  130  | Test22 

我有另外一个这样的:

ID | Type

40 | New1

80 |  New2

100 | Test22 

我没有比较两个列表的字段。因此,我想使用列表的索引(行号)和<>类型。

所以,

第1行和第2行应该更新,因为它们呈现不同的类型。

预期结果:

  Time   |  Temp1  |  Temp2  |  Type

10:42:00 |   108   |   150   |  New1

10:44:00 |   107   |   160   |  New2

10:46:00 |   108   |   130   |  Test22 

我有什么:

foreach (var x in Graph._listData)
{
     var itemToChange = newData2
         .First(d => 
             d[newData2.IndexOf(1)] == Graph._listData.IndexOf(1)).Type = x.Type;
}

我相信这段代码的整个想法是错误的,但这就是我现在得到的。

我桌子的结构:

public struct GraphData
{
    public double Temp1;
    public double Temp2;
    public DateTime Date;
    public string Type;
}

public struct GraphDataWithID
{
    public int IdHeader;
    public string Type;
}
  • 那么,如何根据索引完成两个列表之间的比较?

3 个答案:

答案 0 :(得分:2)

无需使用Linq:

var n = Graph._listData.Count;
for (var i = 0; i < n; i++)
    if (Graph._listData[i].Type != newData2[i].Type) {
        var temp = Graph._listData[i]; 
        temp.Type = newData2[i].Type; 
        Graph._listData[i] = temp;
    }

我相应地编辑了juharr所指出的内容:如果你有一个不可变结构列表,你就不能修改结构元素。

答案 1 :(得分:2)

注意:这仅适用于参考类型。

使用for循环的替代方法是Zip

var zipped = Graph._listData.Zip(
    newData2, 
    (o,n) => new { Original = o, NewDate= n})
foreach(var pair in zipped)
{
    pair.Original.Type = pair.NewData.Type;
}

关于Zip的好处是,它将以两个集合中较短的一个停止,因此如果newData2行数较少,则不必进行任何特殊检查以确保索引超出范围。

然而,对于List结构,for循环是一个更好的主意,因为你必须使用临时变量来保存结构的副本,更新它,然后将它分配给List中的原始位置。

int end = Math.Min(Graph._listData.Count(), newData2.Count())
for(int i = 0; i < end; i++)
{
    if(Graph._listData[i].Type != newData2[i].Type)
    {
        var temp = Graph._listData[i];
        temp.Type = newData2[i].Type;
        Graph._listData[i] = temp;
    }
}

答案 2 :(得分:1)

您可以加入这样的列表。它使用Select方法的重载,该方法使用带索引的Func。

library(stringr)
str_extract(string = a, pattern = "(?<=\\s).")
#[1] "S" "A"