添加List集合覆盖问题

  今天在做一个项目的时候,发现了这样一个问题,为了让大家看得更直接明了,我直接放代码:

  public void InsertObjectToList(){

  List<NewsProtetype> list = new List<NewsProtetype>();

    NewsProtetype info = new NewsProtetype();

    DataTable dt = new DataTable();

    KeywordUrlManage kum = new KeywordUrlManage();

    dt = kum.GetKeywords();

    if (dt.Rows.Count > 0)
    {
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        info.keyword = dt.Rows[i][0].ToString();
        info.url = dt.Rows[i][1].ToString();
        list.Add(info);
      }
    }

}

  当你断点调试的时候就会发现一个很严重的问题,那就是后一个info实体会不断的覆盖前一个实体,最后导致list集合里面的内容都是一样的!当时我一时还不知道为什么会有这个结果,于是我又在for循环里面添加另一个集合记录i的值,确有意思的发现这个是没有被覆盖的!一时间我是百思不得其解;后来我在网上查了,看到有人说是数据类型的区别:int是值类型,而上面是实体info是引用类型!这两者的区别博客园的大牛们都写了很多文章,也很详细,其中我就注意到了这两句:引用类型变量的赋值只复制对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

  我这里的实体是引用类型,也就是说我在for循环赋值的时候,一直都在同一个对象赋值add给List集合。所以不断的给List添加同一个对象,自然会被不断覆盖前有的值,而值类型却没有

所以我就意识到解决这个bug其实只需要把for循环外面定义的实体类转移到for循环内部就可以了,每添加一个实体对象就new一个出来保证不同;其正确的代码如下:

  public void InsertObjectToList(){

   List<NewsProtetype> list = new List<NewsProtetype>();

    DataTable dt = new DataTable();

    KeywordUrlManage kum = new KeywordUrlManage();

    dt = kum.GetKeywords();

    if (dt.Rows.Count > 0)
    {
      for (int i = 0; i < dt.Rows.Count; i++)
      {

        NewsProtetype info = new NewsProtetype();
        info.keyword = dt.Rows[i][0].ToString();
        info.url = dt.Rows[i][1].ToString();
        list.Add(info);
      }
    }

}

  PS:因为本人理论知识不强,不知道我理解对不对,或者说还不够深层次!希望各位朋友指出来,让我学习!谢谢了!

  这是我第一篇技术博客,说来惭愧啊!毕业一年了,以前只是有问题的时候来博客园查资料......今后也会有时间更新博客的,这也是为了提高自己!!好了,就写到这吧

时间: 2024-10-29 03:36:30

添加List集合覆盖问题的相关文章

《算法图解》第八章_贪婪算法_集合覆盖问题

一.贪婪算法介绍 算法基本思路:从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解.每一步只考虑一个数据,他的选取应该满足局部优化的条件.若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止.(摘自 贪婪算法_百度百科) 简单直接的描述,就是指每步都选择局部最优解,最终得到的就是全局最优解. 二.引入:集合覆盖问题 假设你办了个广播节目,要让全美个州的听众都收听得到,为此,你需要决定在哪些广

nginx添加模块 (非覆盖安装)

nginx添加模块(非覆盖安装) 原已经安装好的nginx,现在需要添加一个未被编译安装的模块: 查看原来编译时都带了哪些参数# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.8.1built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) configure arguments: --prefix=/usr/local/nginx --with-http_realip_module --

ArrayList添加新元素的覆盖问题

首先,看一个代码段: 1. ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();2. ArrayList<String> str = new ArrayList<String>();3 . for(int i = 0;i<5;i++){4. str.add(i+"");5. list.add(str);6. System

java集合练习:创建Map集合,创建Emp对象,并将创建的Emp对象添加到集合中

package com.jihe; public class Emp { private String e_id; private String e_name; public Emp(String e_id, String e_name) { super(); this.e_id = e_id; this.e_name = e_name; } public String getE_id() { return e_id; } public void setE_id(String e_id) { t

1.22 P235第三题创建Map集合,创建Emp对象,将Emp对象添加到集合中,并将id为005的对象从集合中移除。

1 public static void main(String[] args) { 2 3 HashMap<String,String> map = new HashMap<String,String>(); //创建集合map 4 5 Emp e1 = new Emp("001","星期一"); 6 Emp e2 = new Emp("002","星期二"); 7 Emp e3 = new Emp(

将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)

- (NSArray *)testa:(NSDictionary *)dic { NSMutableArray *arr_M = [NSMutableArray array]; // 1.遍历每一个元素添加到集合 for (NSString *key in dic.allKeys) { for (NSString *str in dic[key]) { [arr_M addObject:str]; } } return arr_M; } - (NSArray *)testb:(NSDiction

Python 集合set()添加删除、交集、并集、集合操作详解

在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法. 创建集合set python set类是在python的sets模块中,大家现在使用的python2.7.x中,不需要导入sets模块可以直接创建集合.>>>set('boy')set(['y', 'b', 'o']) 集合添加.删除 python 集合的添加有两种常用方法,分别是add

Python 集合set添加删除、交集、并集、集合操作符号

在Python中集合set是基本数据类型的一种,它有可变集合(set)和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法. 1.创建集合 set类是在python的sets模块中,大家现在使用的python2.3中,不需要导入sets模块可以直接创建集合.>>>set('boy')set(['y', 'b', 'o']) 2.集合添加.删除 集合的添加有两种常用方法,分别是add和update.集合add方法:是把要

往一个集合里面添加10个数字0-9,并且不相同

ArrayList list = new ArrayList(); //声明一个新集合 Random r = new Random(); //声明一个随便数对象 for (int i = 0; i < 10; ) //i<10 循环10次往集合里面添加数字 { int rNumber = r.Next(0, 10); //将随机数赋值给rNumber if (!list.Contains(rNumber)) //如果list集合中不包含rNumber [list.Contains(rNumbe