【问题标题】:How do I get first element of each array via Linq C#如何通过 Linq C# 获取每个数组的第一个元素
【发布时间】:2018-02-23 08:37:21
【问题描述】:

我对@9​​87654322@ 非常陌生,并且对此代码有疑问:

double[] values;
private List<double[]> valueList = new List<double[]>();
void AddNewValues(double d1, double d2, double d3)
{
   values[0] = d1;
   values[1] = d1;
   values[2] = d1;
   valueList.Add(values);
}

void GetAllFirstValues()
{
   var test = valueList.Where(s => s == typeof(double[0]));
}

如何获取列表中每个数组的第一项?

这可能吗? Linq 是这样做的正确方法还是有更聪明的解决方案?

【问题讨论】:

  • var test = valueList.Where(s =&gt; s == typeof(double[0])).FirstOrDefault();
  • 为什么是typeof(double[0]) 而不是s.First()?为什么要使用typeof?使用valueList.Select(s =&gt; s.First())
  • 除了typeof(double[0]) 是无效语法之外,检查s == typeof(double[]) 在上面的示例中永远不会为真。 s 是一个双精度数组值,而 typeof(double[]) 将返回 Type。如果要检查它是否是双数组,则需要s.GetType() == typeof(double[]) 或模式匹配s is double[]。然而,这在您的代码中是不需要的,因为 List 被键入为 double[]。
  • 您的设置代码有很多问题/怪异之处,应该在任何人尝试回答之前解决。 1.你还没有初始化values数组,所以values[0] = d1等语句都会抛出异常。 2. 您将 d1 的值全部分配给数组元素三次,忽略 d2 和 d3(可能不是您的意图)。它可能会帮助您首先添加几个对 AddNewValues() 的调用,这样您就可以看到您的 AddNewValues() 方法有什么问题。

标签: c# arrays list linq


【解决方案1】:

这应该是System.Linq,你不需要检查类型。如果数组为空,它将选择 first 或 default 并返回它。

IEnumerable<double> d =  l.Select(array => array.FirstOrDefault())

或者,如果您只想过滤非空数组:

IEnumerable<double> d = l.Where(array => array.Any()).Select(array => array.First());

请注意,数组也可以是 null,因此您甚至可以在 Where 子句中过滤掉它。

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2021-10-05
    • 2011-05-04
    • 2021-05-26
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多