【问题标题】:Get array consisting of first values of a list of tuples获取由元组列表的第一个值组成的数组
【发布时间】:2019-12-08 23:28:07
【问题描述】:

在我的 C# 代码中,我有一个元组列表。元组本身由两个 double 类型的数字和一个 LocalDate 类型的对象组成。

List<Tuple<double, double, LocalDate>> tupleList = new List<Tuple<double, double, LocalDate>>();

例如,该列表可能如下所示。

1, 10, LocalDate1
12, 310, LocalDate2
31, 110, LocalDate3

创建一个只包含每个列表项的第一个双精度值的双精度数组的优雅方法是什么?

因此,我想要一个仅由列表中的 LocalDate 对象组成的 ArrayList。应该保留顺序。

预期的结果应该是:

double[] => [1, 12, 31]
double[] => [10, 310, 110]
ArrayList<> => [LocalDate1, LocalDate2, LocalDate3]

我知道通常的方法是在 for 循环中迭代列表并通过此循环创建数组。不过我觉得应该有更简洁优雅的方式。

【问题讨论】:

    标签: c# list loops iterator tuples


    【解决方案1】:

    Linq 将是要走的路:

    var firstValues = tupleList.Select(x => x.Item1).ToList();
    

    这会将元组列表投影到仅包含第一个项目的列表中,并保持它们的顺序。与第二、第三、第 n 项相同。
    如果你想要一个数组,只需调用ToArray() 而不是ToList()

    【讨论】:

    • 谢谢。如何获得ArrayList?由于其他代码依赖关系,我正是需要这个 typ.e
    • 如果你必须使用ArrayList,有一个签名为ArrayList(ICollection)的构造函数。所以你可以像这样使用它:ArrayList firstValues = new ArrayList(tupleList.Select(x =&gt; x.Item1).ToList());
    • 嗯,这很奇怪。您可以尝试将构造函数参数作为命名参数传递:new ArrayList(c: tupleList.Select(x =&gt; x.Item1).ToList());,也许这会强制编译器使用该特定构造函数。
    • 对不起,我的错(这就是我删除评论的原因):我正在使用 ikvm(java 到 C# 代码迁移),而 ArrayList 类实际上是 java.util.ArrayList,因此造成了混乱。感谢您的帮助。
    • 不客气!如果此答案对您有所帮助,请考虑使用复选标记将其标记为已接受。
    【解决方案2】:

    这可以通过基线 for 循环来完成:

    //Sorry for any Syntax errors. Got no VS installation in reach
    double[] output = new double[tupleList.Length];
    
    for(int i = 0; i < tupleList.Length; i++){
      output[i] = tupleList[i].Item1;
    }
    

    当然,像 linq 之类的东西或任何一般使用 lambdas 的东西可能更现代。但我怀疑它是否更快或更高效。它必须使用某种列表并从中创建一个数组。

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2012-05-30
      • 2021-12-14
      相关资源
      最近更新 更多