【问题标题】:How to "interleave" two DataTables如何“交错”两个数据表
【发布时间】:2011-03-01 23:22:17
【问题描述】:

拿这两个列表:

列表 1

红色 绿色的 蓝色

清单 2

棕色 红色的 蓝色 紫色的 橙色

我正在寻找一种方法将这些列表组合在一起以生成:

清单 3

棕色 红色的 绿色的 蓝色 紫色的 橙色

我认为基本规则如下:

1) 将落在第一个公共行之前的任何行插入到列表顶部(例如,布朗位于第一个公共行之前,红色);

2) 如果两个列表都有两个项目,则在行之间插入项目(例如,列表 1 在红色和蓝色之间插入绿色);和

3) 如果在 2 中没有找到“中间性”,则在底部插入行(例如,列表 2 在底部插入橙色)。

列表存储在 DataTable 中。我猜我必须在迭代时在它们之间切换,但我很难找出组合这些行的方法。

感谢您的帮助。

--布伦特

【问题讨论】:

  • 订单有那么大的区别吗?直接走到路口不是更简单吗?
  • @Thomas,我理解这意味着排序是考虑到 3 点的重要部分。否则,正如您所展示的那样,它相当简单。
  • @SnOrfus - 如果排序很重要,那么有很多关于处理边缘情况的问题,我在帖子中提到过。
  • @Thomas,同意,我不相信我的实现会涵盖这些情况。来自 OP 的信息会很好。 (顺便说一句,现在读它,我可能会觉得它听起来像一个 dbag;我并没有尝试)
  • @Thomas:是的,顺序很重要。如果有帮助,我会尝试逐个季度匹配 XBRL 财务报表中的行项目,然后将结果输出到电子表格中。例如,如果在第一季度,申报者没有打破总收入的“销售”数字,但在第二季度这样做,我需要足够的聪明才能在收入之前添加一条销售线,但在任何项目之后可能会出现在第一季度提交的总收入之前。我认为,处理边缘情况会有点随机,只要随机性是“一致的”,客户应该可以接受。

标签: c# merge datatable


【解决方案1】:

如果你想加入两个标准列表并且不关心排序,你可以使用这样的东西:

var list1 = new[] { "Red", "Green", "Blue" };
var list2 = new[] { "Brown", "Red", "Blue", "Purple", "Orange" };

var result = new List<string>( list2 );
result.AddRange( list1.Except( list2 ) );

试图维持一些特殊的秩序会很困难。例如,假设 list2 不包含 Red,那么第一项应该是什么:Brown 或 Red?假设 list1 最后是黄色,但 list2 第二个是黄色。顺序应该是什么?

如果您尝试合并两个 DataTable,则 DataTable 上有一个 Merge 方法,可让您将一个 DataTable 合并到另一个 DataTable。

DataTable.Merge

【讨论】:

    【解决方案2】:

    我认为这些方面的东西应该为你做:

    Dictionary<string, float> clrs = new Dictionary<string, float>();
    
    float i = 0;
    foreach (string s in largeList)
        clrs.Add(s, i++);
    
    float lastIndex = 0;
    for (int j = 0; j < smallList.Count; j++)
    {
        if (largeList.Contains(smallList[j]))
            lastIndex = clrs[smallList[j]];
        else
            clrs.Add(smallList[j], lastIndex + 0.5f);
    }
    
    var sorted = from c in clrs.Keys orderby clrs[c] select c;
    
    return sorted.ToList<string>();
    

    它假定两个列表中都没有重复,并且该函数将较大的列表作为 largelist 传递。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多