【问题标题】:Save 3 lists to text seperated by commas [closed]将 3 个列表保存为用逗号分隔的文本 [关闭]
【发布时间】:2013-12-12 18:36:50
【问题描述】:

我有三份成分、数量和单位的清单。我需要将所有三个保存到以逗号分隔的文本文件中。例如[ingredient],[amount],[units]。我目前正在使用嵌套的foreach 循环,但这样可以保存它们的每个组合。我该如何解决这个问题?

foreach (string q in ingredients)
{
    foreach (int w in newAmounts)
    {
        foreach (string r in units)
        {
            writer.Write(q + ",");
            writer.Write(w + ",");
            writer.Write(r + "\n");
        }
    }
}

谢谢

【问题讨论】:

  • 您的代码当前将成分、数量和单位的每种组合保存到您的文件中。你希望它如何预成型? 3个列表之间是什么关系?

标签: c# list foreach


【解决方案1】:

如果所有列表的计数相同,则可以使用一个 for 循环而不是三个 foreach:

for(int i=0; i<ingredients.Count;i++)
{
   writer.Write(ingredients[i] + ",");
   writer.Write(newAmounts[i] + ",");
   writer.Write(units[i] + "\n");
 }

【讨论】:

  • 3张表之间没有关系,不推荐使用这个。
  • 此解决方案确实解决了您的问题,但假定所有三个列表的长度相同。基于真实的问题,但它也很脆弱。
  • 谢谢,解决了我的问题。
【解决方案2】:
  for (int i = 0; i < ingredients.Length; i++)
  {
    writer.Write(string.Format("{0}, {1}, {2}\n", ingredients[i], newAmounts[i], units[i]);
  }

【讨论】:

    【解决方案3】:

    您需要的是Enumerable.Zip。它需要两个IEnumerables 并将它们变成一个新类型的IEnumerable。如果三个集合在索引上匹配,则代码如下所示:

    var tuples = ingredients
        .Zip(newAmounts,
            (i, a) => new Tuple<string, string>(i, a))
        .Zip(units,
            (t, a) => new Tuple<string, string, string>(t.Item1, t.Item2));
    
    foreach (var t in tuples)
    {
        writer.Write(t.Item1 + ",");
        writer.Write(t.Item2 + ",");
        writer.Write(t.Item3 + "\n");
    }
    

    代码可能看起来有点难看,但您可以通过添加一些 ZipToTuple 帮助函数来完成繁重的工作来使其变得更好。

    public static IEnumerable<Tuple<T1, T2>> ZipToTuple<T1, T2>(
        this IEnumerable<T1> e1,
        IEnumerable<T2> e2)
    {
        return e1.Zip(e2,
            (t1, t2) => new Tuple<T1, T2>(t1, t2));
    }
    
    public static IEnumerable<Tuple<T1, T2, T3>> ZipToTuple<T1, T2, T3>(
        this IEnumerable<T1> e1,
        IEnumerable<T2> e2,
        IEnumerable<T3> e3)
    {
        return e1
            .ZipToTuple(e2)
            .Zip(e3,
                (t, t3) => new Tuple<T1, T2, T3>(t.Item1, t.Item2, t3));
    }
    

    那么代码就变成了:

    foreach (var t in ingredients.ZipToTuple(newAmounts, units))
    {
        writer.Write(t.Item1 + ",");
        writer.Write(t.Item2 + ",");
        writer.Write(t.Item3 + "\n");
    }
    

    【讨论】:

    • 努力,但如果没有清楚地了解 OP 想要什么,很难给出一个好的答案。
    • 是的。如果没有更多信息,我可以假设这些列表之间的唯一关系是索引顺序。然而,索引顺序关系恰好是新程序员(比如那些尚未完全理解内部循环含义的程序员)的直观模式,所以我敢打赌我的假设是正确的。
    • 你知道,当我第一次看到这个时,我认为答案是“只需制作 3 个单独的 foreach 循环”。也许我太简单了,或者其他人都过分了。
    • 好吧,那是行不通的,因为他特别想要每行上的成分、数量和单位的异质组合,但是这个线程上的许多简单答案对于这个问题来说已经绰绰有余了,正如 OP 接受其中之一所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多