Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 算法:两个表与ID连接,从中计算一个新表_C#_Excel_Algorithm_Linq_Key - Fatal编程技术网

C# 算法:两个表与ID连接,从中计算一个新表

C# 算法:两个表与ID连接,从中计算一个新表,c#,excel,algorithm,linq,key,C#,Excel,Algorithm,Linq,Key,我有两个Excel表格供输入 第一个表的结构如下(第一个表,字段:id,value,无主键): 等,直到文件结束(尚未确定) 第二个类似(第二个表,字段:id,value,id是主键): 等,直到文件结束(尚未确定) 我想从这些表中创建一个新表(我们称之为output_table)。新表应该包含相同的字段:ID和value。在这个新表中,我希望从第一个表中写入每个记录,并保持其顺序(这非常重要,因为它位于时间线中)。这些值应根据以下条件进行更改: -ID正在连接中 -如果第一个_table.va

我有两个Excel表格供输入

第一个表的结构如下(第一个表,字段:id,value,无主键):

等,直到文件结束(尚未确定)

第二个类似(第二个表,字段:id,value,id是主键):

等,直到文件结束(尚未确定)

我想从这些表中创建一个新表(我们称之为output_table)。新表应该包含相同的字段:ID和value。在这个新表中,我希望从第一个表中写入每个记录,并保持其顺序(这非常重要,因为它位于时间线中)。这些值应根据以下条件进行更改:
-ID正在连接中
-如果第一个_table.value高于或等于第二个_table.value,则output.value:=第二个_table.value。在这一点上,我想省略它下面具有相同ID的记录(在第一个表中),并转到下一个ID类型。
-如果第二个_table.value的值高于第一个_table.value,则为下一步输出_table.value:=第一个_table.value和第二个_table.value的引用:=(第二个_table.value-第一个_table.value)(如果发生这种情况,我希望使用计算出的引用调查下一条记录,直到第一个_表中出现一个新ID,否则第一个条件将为true)

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

好的

您可以为第一个表和输出表值创建一个类(可以使用
元组,但可能更容易理解)

public class MyDatas {
   public string Id {get;set;}
   public int Value {get;set;}
}
假设您从第一个表中有一个
MyDatas

对于第二个表a
字典

这似乎是合理的

然后创建一个空的
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;
  }
}
var table1=新列表();
var table2=新字典();
var输出=新列表();
//老天爷,在这种情况下,这可能比林克更清楚。
foreach(表1中的变量l1){
var-id=l1.id;
//默认值:我们采用表1值(如果Id不在表2中或表2值>表1值
var newData=newmydatas{Id=Id,Value=l1.Value};
输出。添加(新数据);
//表1的id不在表2中,请转到下一行。
如果(!table2.ContainsKey(id))继续;
//如果表1值>=表2值=>取表2值
如果(l1.Value>=表2[id])
newData.Value=table2[id];
//如果表2值=>表1值,则将表1值保留为输出值,并递减表2值
否则{
表2[id]=l1.值;
}
}

没关系,它工作得很好。我还有一个问题:如果我想从输出中删除(ID)已获得尽可能多的值的记录(由于条件),您有什么建议从表2中可以清楚地看到,我的输出应该是:ID1-2、ID2-3、ID2-1、ID3-1、ID4-1、ID4-1。我将尝试从另一个角度来处理这个问题,并且更加具体。因此,本质上,表1中的记录表示空(空闲)空间。而表2中的记录表示值(加载)如果一个ID的可用空间小于表2中的load值,那么我们必须填充每个位置(这意味着表1中具有相同ID的记录只会进入输出表)。如果我们有更多的可用空间(求和相同的ID值)然后我们必须在表1中按顺序移动,并用load填充尽可能多的空间。当load用完,但我们仍然有空闲空间时,不能将记录插入到输出表中。按照此逻辑,输出表应该与我前面的注释一样。@KNG开始,我将尝试查看今天下午;)
public class MyDatas {
   public string Id {get;set;}
   public int Value {get;set;}
}
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;
  }
}