将数据从一个列表添加到另一个列表的算法

时间:2014-09-23 19:17:58

标签: .net algorithm

我有一个对象列表:

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

我有一些带有行的数据表。

1234 D
891  E
1234 F

我想将这些值从datatable添加到内存列表中的各个对象。例如,我想在列表中找到包含ID 1234的对象,并向对象添加值DF

什么会有最好的表现?

  1. 对迭代的数据表进行排序,每次搜索列表
  2. 将数据表存储到哈希表/字典中,然后遍历列表,对每个键执行字典查找
  3. 别的什么?
  4. 编辑:不是真正的数据库问题,我会尽力使其更清晰

3 个答案:

答案 0 :(得分: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

答案 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());
    }
}

答案 2 :(得分:0)

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

从您的问题看来,您希望进行批量操作 - 这意味着在内存中执行所有这些操作,而不是在1次操作中更新数据库。 为此你使用哈希表