首页 > 解决方案 > If 语句覆盖先前的 Setter

问题描述

这可能是一件非常简单的事情,但我已经尝试了一些事情并且无法理解如何防止覆盖 foreach -> if 语句中的值。

我有一个文件,其中包含Entries其中的个人Entry。我正在尝试为每个人设置不同的值,Entry但目前它正在正确设置它们,但在每次迭代时都会覆盖。

var inputdoc = _service.ConvertToDocument(input);
var journal = _service.ConvertFromDocument(inputdoc);

foreach (var i in inputdoc .Body)
{
            
        foreach (var doc in journal.Entries)
        {
            doc.Entity = entityCode;

            if (doc.Entity == 12345)
            {
                if (i.Number == "VALBEU1") { doc.BankAccount = "435345345"; }
                if (i.Number == "VALBGB1") { doc.BankAccount = "324234234"; }
                if (i.Number == "VALBHU1") { doc.BankAccount = "45342123123"; }
                if (i.Number == "VALBMX1") { doc.BankAccount = "45546231"; }
                if (i.Number == "VALBSE1") { doc.BankAccount = "2344353123"; }
                if (i.Number == "VALBUS1") { doc.BankAccount = "234435645"; }
                if (i.Number == "VALBNO1") { doc.BankAccount = "234233123"; }
            }
        }
  }

因此,问题是单个Entry最终结果具有相同的 BankAccount 值,而当它应该不同时取决于i.Number.. 那么我如何才能做到这一点,以便当我通过我的值Entries并设置我的Entry值时,该BankAccount数字仍然存在相同并移动到下一个条目..设置该值等等..

标签: c#for-loopif-statement

解决方案


您可以压缩这两个序列以创建输入文档和日记帐条目对。此外,您可以创建字典以通过输入代码查找帐号。

var accountDict = new Dictionary<string, string>() {
    ["VALBEU1"] = "435345345",
    ["VALBGB1"] = "324234234",
    ["VALBHU1"] = "45342123123",
    ...
};

var inputdoc = _service.ConvertToDocument(input);
var journal = _service.ConvertFromLedger(ledger);

// Create tuples of input docs and journal entries
var inputAndDocs = inputdoc.Body.Zip(journal.Entries, (input, doc) => (input, doc);

foreach (var pair in inputAndDocs)
{
    var doc = pair.doc;
    doc.Entity = entityCode;
    if (doc.Entity == 23380 &&
        accountDict.TryGetValue(pair.input.Number, out var account))
    {
        doc.BankAccount = account;
    }
}

这假设输入文档和日记帐分录必须按给定顺序成对匹配。

您始终分配相同的entityCode值,然后在循环内部测试它是否与常数匹配。由于entityCode从不更改,您可以提前进行此测试并完全跳过整个过程。

if (entityCode == 23380) {
    // TODO: initialize
    foreach (var pair in inputAndDocs)
    {
        var doc = pair.doc;
        doc.Entity = entityCode;
        if (accountDict.TryGetValue(pair.input.Number, out var account)) {
            doc.BankAccount = account;
        }
    }
}

为什么你的方法不起作用?让我们做一个简单的例子:

int[] aArray = { 1, 2, 3 };
int[] bArray = { 10, 20, 30 };
foreach (int a in aArray) {
    foreach (int b in bArray) {
        Console.WriteLine($"{a}, {b}");
    }
}

印刷

1, 10
1, 20
1, 30
2, 10
2, 20
2, 30
3, 10
3, 20
3, 30

使用压缩序列和单个 foreach;然而,产量

1, 10
2, 20
3, 30

除了压缩,您还可以使用单个 for 循环

for (int i = 0; i < Math.Min(a.Length, b.Length); i++) {
    Console.WriteLine($"{aArray[i]}, {bArray[i]}");
}

推荐阅读