首页 新闻 会员 周边

dataTable数据

0
[已解决问题] 解决于 2022-03-03 15:22

dataTable数据,为什么修改了datarow里的数据,dataTable里的数据会与datarow数据同步?
还有那些数据类型也是一样的,求大佬高速我,现在高比清楚那些数据是可以修改其“子类”从而可以修改本身的数据。求教了

c#

信海哥的主页 信海哥 | 菜鸟二级 | 园豆:222
提问于:2022-01-17 14:19
< >
分享
最佳答案
0

不是很明白,dataTable是数据表啊,你修改了数据表中datarow数据行的数据,数据表肯定也会跟着变啊
你对datarow中任何数据的修改都会影响到dataTable,因为datarow是dataTable的一部分,dataTable就是由很多个datarow构成的,你可以按照excel表格来理解

奖励园豆:5
WmW | 菜鸟二级 |园豆:424 | 2022-01-17 18:32

Dictionary<string,object> 键值对数据呢?我试过也是和dataTable一样,这又是什么数据呢
还有那些是这类型的数据呢

信海哥 | 园豆:222 (菜鸟二级) | 2022-01-17 18:45

@信海哥: Dictionary是字典, 不是很理解你的疑惑,无论是dtaTable还是Dictionary这都是数据容器,你更改了里面的数据,无论从哪个角度看,容器中的数据都应该是被更改的吧

WmW | 园豆:424 (菜鸟二级) | 2022-01-18 09:26

@WmW:

这里是为什么呢

信海哥 | 园豆:222 (菜鸟二级) | 2022-01-18 09:37

@信海哥: 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 | 园豆:424 (菜鸟二级) | 2022-01-18 10:51

@WmW: ToList()是会创建新的容器是吧?还有“如果不想使用foreach,就需要一个中间变量将IEnumerable转成List”具体怎么搞?还有我要怎么判断什么方法会改变引用,那些不会呢,求指教

信海哥 | 园豆:222 (菜鸟二级) | 2022-01-18 11:11

@信海哥: 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 | 园豆:424 (菜鸟二级) | 2022-01-18 11:40

@WmW: “搞清楚引用类型和值类型,然后就是看代码”
搞不清引用类型和值类型,然后看代码是指什么

信海哥 | 园豆:222 (菜鸟二级) | 2022-01-18 12:07

@信海哥: 引用类型和值类型相关文章网上一搜一大堆,你找篇简单易懂的应该很容易看明白
看代码的意思就是看代码写的是什么意思,程序员就是干这个,毕竟看不懂代码就没办法写代码,微软官方库和第三方库一般都会有注释说明,没有的话还是网上搜也能搜到

WmW | 园豆:424 (菜鸟二级) | 2022-01-18 15:01

@WmW: 好的大佬

信海哥 | 园豆:222 (菜鸟二级) | 2022-01-18 15:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册