2014-09-23 97 views
0

我有对象的列表作为这样的:算法从一个列表添加到另一个数据

someID: 1234 values: A, B 
someID: 891 values: C 

我有一些行的数据表。

1234 D 
891 E 
1234 F 

我想将这些值从datatable添加到它们各自的对象在列表内存中。因此,例如,我想在列表中找到ID 1234的对象,并将值DF添加到对象。

什么会有最好的表现?

  1. 排序DataTable中的迭代事情的经过,搜索列表每次
  2. 存储的数据表到一个哈希表/字典,然后通过每个按键上
  3. 别的东西进行字典查找列表循环?

编辑:不是一个真正的DB的问题,我会尝试,使之更加明确

+0

你并不需要比迭代的datatagble对方做任何事所以不需要对数据表进行排序或将其放入字典中。 – Paparazzi 2014-09-23 19:29:52

回答

1

您可以使用Linq-To-DataSet

var both = from row in dt.AsEnumerable() 
      join objA in objectAList 
      on row.Field<int>(0) equals objA.someID 
      select new { row, objA }; 
foreach(var x in both) 
{ 
    x.objA.values.Add(x.row.Field<string>(1)); // presuming an `IList<T>` 
} 

如果它不是一个名单,但例如数组,你可以使用:

x.objA.values = x.objA.values.Concat(new[]{x.row.Field<string>(1)}).ToArray(); 

Enumerable.Join使用引擎盖所以it's rather efficient下集。

0

为了您的需要,在ID上创建主键并执行upinsert(更新或插入不存在) - 因此您需要对每个ID执行1次操作,并可以创建存储过程以追加新数据。

从你的问题似乎你想做批量操作 - 意味着做内存中的所有这些操作,而不是在1次操作中更新数据库。 对于您使用哈希表

1

你只需要通过行迭代,搜索了id和值添加到它

foreach (DataRow item in datatable.Rows) 
{ 
    <YourType> thing = list.Find(x => x.someID == (int)item[0]); 
    if (thing == null) 
    { 
     List<string> values = new List<string>(); 
     values.Add(item[1].ToString()); 
     list.Add(new <YourType> { someID = (int)item[0], values = values }); 
    } 
    else 
    { 
     thing.values.Add(item[1].ToString()); 
    } 
} 
+0

这是什么运行时间,它会比首先将其放入散列表/字典然后搜索? – cppNoob 2014-09-24 21:40:59

+0

插入100000个随机值,其ID为1到9,花费0.789秒来处理它们,同时将它们写入屏幕,我发现将它们插入散列表或字典中没有任何好处,因为您已经可以迭代datable中的行,唯一的好处是能够通过名称来引用'列',而不是行数组内的位置 – 2014-09-26 13:27:06

相关问题