遍历List<T>时,出现比较奇怪的问题;百思不得其解,请教牛人。
/*Loop Generic List
* Print:
* 1 001wqk female
* 1 001wqk female
*/
这里输出的东西,让人很疑问。
我觉得应该输出/*Loop Generic List
* Print:
* 0 000wqk male
* 1 001wqk female
*/
using System;
using System.Collections.Generic;
using System.Text;namespace StringCls
{
    [Serializable]
    public class PersonEntity
    {
        public PersonEntity()
        { 
        }        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }        private string sex;
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }
    }
}
using System;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Text;namespace StringCls
{
    class Program
    {
        static void Main(string[] args)
        {
            PersonEntity entity = new PersonEntity();
            List<PersonEntity> entities = new List<PersonEntity>();            DataTable dt = GenerateDataTable();
            PopulateDataTable(dt);
            /*Loop DataTable
             * Print:
             * 0 000wqk male
             * 1 001wqk female
            */
            foreach(DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["ID"].ToString()+" "+dr["Name"].ToString()+" "+dr["Sex"].ToString());
            }
           
            Console.WriteLine("-------------------");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                entity.ID = Convert.ToInt32(dt.Rows[i]["ID"].ToString());
                entity.Name = dt.Rows[i]["Name"].ToString();
                entity.Sex = dt.Rows[i]["Sex"].ToString();
                entities.Add(entity);
            }
            /*Loop Generic List
             * Print:
             * 1 001wqk female
             * 1 001wqk female
            */
            LoopGenericList(entities);
            Console.ReadLine();
        }
        /// <summary>
        /// Loop Generic List
        /// </summary>
        /// <param name="entities"></param>
        static void LoopGenericList(List<PersonEntity> entities)
        {
            foreach (PersonEntity entity in entities)
            {
                Console.WriteLine(entity.ID + " " + entity.Name + " " + entity.Sex);
            }
        }
        /// <summary>
        /// Generate structure of DataTable
        /// </summary>
        /// <returns></returns>
        static DataTable GenerateDataTable()
        {
            DataTable dt = new DataTable();            DataColumn dc = new DataColumn();
            dc.ColumnName = "ID";
            dc.DataType = typeof(System.Int32);
            dt.Columns.Add(dc);            dc = new DataColumn();
            dc.ColumnName = "Name";
            dc.DataType = typeof(System.String);
            dt.Columns.Add(dc);            dc = new DataColumn();
            dc.ColumnName = "Sex";
            dc.DataType = typeof(System.String);
            dt.Columns.Add(dc);
            return dt;
        }
        /// <summary>
        /// Populate DataTable
        /// </summary>
        /// <param name="dt"></param>
        static void PopulateDataTable(DataTable dt)
        {
            for (int i = 0; i < 2; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID"] = i;
                dr["Name"] = "00" + i.ToString() + "wqk";
                dr["Sex"] = i == 0 ? "male" : "female";
                dt.Rows.Add(dr);
            }
        }
    }
}

解决方案 »

  1.   

    for (int i = 0; i < dt.Rows.Count; i++)
                {
    PersonEntity entity = new PersonEntity();                entity.ID = Convert.ToInt32(dt.Rows[i]["ID"].ToString());
                    entity.Name = dt.Rows[i]["Name"].ToString();
                    entity.Sex = dt.Rows[i]["Sex"].ToString();
                    entities.Add(entity);
                }
      

  2.   

    for (int i = 0; i < dt.Rows.Count; i++) 
                { 
                    PersonEntity entity = new PersonEntity();                 entity.ID = Convert.ToInt32(dt.Rows[i]["ID"].ToString()); 
                    entity.Name = dt.Rows[i]["Name"].ToString(); 
                    entity.Sex = dt.Rows[i]["Sex"].ToString(); 
                    entities.Add(entity); 
    } 引用类型,每次操作都是同一块内存。
      

  3.   

    DataTable添加新行,没这么干过。使用List<>时,没注意到两次遍历是操作同一块内存区域。
    我调试啊,到entities.Add(entity)还很正常,怎么出来循环两条数据就一样了呢。调啊调..
    ^_^调的都不知道思考了^_^for (int i = 0; i < 2; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["ID"] = i;
                    dr["Name"] = "00" + i.ToString() + "wqk";
                    dr["Sex"] = i == 0 ? "male" : "female";
                    dt.Rows.Add(dr);
                }