算法:两个表与ID连接,从它们计算一个新表

本文关键字:计算 新表 一个 ID 两个 算法 连接 | 更新日期: 2023-09-27 18:03:11

我有两个Excel表格用于输入。

第一个表的结构类似于(first_table, fields: id, value,无主键):

ID1 4  
ID1 5  
ID1 2  
ID2 3  
ID2 1  
ID3 1  
ID4 1  
ID4 3  

等,直到文档结束(不确定)

第二个类似于(second_table, fields: id, value, id是主键):

ID1 2  
ID2 5  
ID3 1  
ID4 2 

等,直到文档结束(不确定)

我想从这些创建一个新表(让我们称之为output_table)。新表应该包含相同的字段:ID和value。在这个新表中,我想从第一个表中写入每个记录,保持其顺序(这很重要,因为它在一个时间轴中)。这些值应根据以下条件进行更改:
- ID在连接
-如果first_table。Value大于或等于second_table。值,输出。取值:= second_table.value。在这一点上,我想省略它下面具有相同ID的记录(在第一个表中),并步骤到下一个ID类型。
-如果是second_table。Value大于first_table。值,然后是output_table。取值范围:= first_table。值和second_table的引用。取值:= (second_table.)value - first_table.value)用于下一步(如果发生这种情况,我想使用计算的引用调查下一条记录,直到从first_table中出现新ID,否则第一个条件将为真)

我想不出正确的算法,请帮助我!谢谢你的帮助!!我在c#中工作,我已经从两个输入表中创建了(记录)对象列表。(所以也许Linq会帮助我)

算法:两个表与ID连接,从它们计算一个新表

ok

您可以为first_table和输出表值创建一个类(您可以使用Tuple<string, int>代替,但它可能更容易理解)。

public class MyDatas {
   public string Id {get;set;}
   public int Value {get;set;}
}

假设您有一个来自first_table的MyDatas列表

对于second_table a Dictionary<string, int>

这似乎是合理的。

然后创建MyDatas的空列表,这是您的输出。

var table1 = new List<MyDatas>(<content of first_table>);
var table2 = new Dictionary<string, int>(<content of second_table>);
var output = new List<MyDatas>();
//good old foreach, this may be clearer than linq in this case.
foreach (var l1 in table1) {
  var id = l1.Id;
  //default : we take table 1 Value (if Id is not in table2 or table 2 value > table1 value
  var newData = new MyDatas{Id = id, Value = l1.Value};
  output.Add(newData);
  //id of table1 is not in table 2, go to next line.
  if (!table2.ContainsKey(id)) continue;

  //if table 1 value > = table 2 value => take table 2 value
  if (l1.Value >= table2[id])
     newData.Value = table2[id];
  //if  table 2 value => table 1 value, keep table 1 value for output and decrement table2 value
  else {
      table2[id] -= l1.Value;
  }
}