dataTable数据,为什么修改了datarow里的数据,dataTable里的数据会与datarow数据同步?
还有那些数据类型也是一样的,求大佬高速我,现在高比清楚那些数据是可以修改其“子类”从而可以修改本身的数据。求教了
不是很明白,dataTable是数据表啊,你修改了数据表中datarow数据行的数据,数据表肯定也会跟着变啊
你对datarow中任何数据的修改都会影响到dataTable,因为datarow是dataTable的一部分,dataTable就是由很多个datarow构成的,你可以按照excel表格来理解
Dictionary<string,object> 键值对数据呢?我试过也是和dataTable一样,这又是什么数据呢
还有那些是这类型的数据呢
@信海哥: Dictionary是字典, 不是很理解你的疑惑,无论是dtaTable还是Dictionary这都是数据容器,你更改了里面的数据,无论从哪个角度看,容器中的数据都应该是被更改的吧
@WmW:
这里是为什么呢
@信海哥: head["Type"] = 3 改变了,是因为数据的引用没变,第二行的Data["head"] as JObject只是将数据转成了具体的类型,没有改变引用,所以你修改head中的Type,其实就是修改data中的head的Type
第二个代码块中的数据没变,是因为引用改变了,body["OrdersA"].ToObject<List<JObject>>()这段代码会改变引用,它创建了一个新的对象,将容器中的数据拷贝过去了,你循环更改的是新的对象中的数值,不是容器中的数据
如果想要第二个代码快的数据也跟着变,将body["OrdersA"].ToObject<List<JObject>>()改成body["OrdersA"].AsEnumerable(),下面的代码需要使用foreach,如果不想使用foreach,就需要一个中间变量将IEnumerable转成List
@WmW: ToList()是会创建新的容器是吧?还有“如果不想使用foreach,就需要一个中间变量将IEnumerable转成List”具体怎么搞?还有我要怎么判断什么方法会改变引用,那些不会呢,求指教
@信海哥: ToList是创建一个容器,然后将原来的对象引用仍进去,这些引用指向的地址和data字典中的是一样的,ToObject<List<Jobject>>反编译看代码也是创建了一个容器,但是它向里仍数据的时候,是创建了新的对象,并解析就原来的对象,将原来的对象的数值赋值到新的对象中,因此ToObject<List<Jobject>>中对象的指向已经不是原data中的对象的地址了,更改其中的数据不会影响到原来的data
判断是否会改变引用首先要搞清楚引用类型和值类型,然后就是看代码
转成List是把枚举器IEnumerable转成具体容器List,注释的是枚举器的用法,个人觉得更简单
var body = Data["body"] as JObject;
var ordersA = body["OrdersA"].AsEnumerable();
//ordersA = ordersA.Where(a => Convert.ToDecimal(a["ActualWeight"]) > 0);
//foreach (var p in ordersA) {
// string theId = p["ID"].ToString();
// p["ID"] = "";
// p["SourceID"] = theId;
//}
var temp = ordersA.Where(a => Convert.ToDecimal(a["ActualWeight"]) > 0).ToList();
for (int i = 0; i < temp.Count; i++) { //这里没有改变
string theId = temp[i]["ID"].ToString();
temp[i]["ID"] = "";
temp[i]["SourceID"] = theId;
}
@WmW: “搞清楚引用类型和值类型,然后就是看代码”
搞不清引用类型和值类型,然后看代码是指什么
@信海哥: 引用类型和值类型相关文章网上一搜一大堆,你找篇简单易懂的应该很容易看明白
看代码的意思就是看代码写的是什么意思,程序员就是干这个,毕竟看不懂代码就没办法写代码,微软官方库和第三方库一般都会有注释说明,没有的话还是网上搜也能搜到
@WmW: 好的大佬