我认为这与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;
}
答案 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"