int数组不能在linq表达式中使用length属性

时间:2016-03-18 07:57:17

标签: c# linq

我有这个非常简单的c#语句

       var list = new int[4];

        var query1 = from element in list
                     where element.Length > 10
                     select element;

由于某种原因,它不允许我使用int数组的Length属性并抛出以下异常:

'int' does not contain a definition for 'Length' and no extension method 
'Length' accepting a first argument of type 'int' could be found (press F4 
to add a using directive or assembly reference)

我无法想象发生了什么。如果我写下以下内容:

 var query1 = from element in list.Length
                     where element > 10
                     select element;

然后它有效。

6 个答案:

答案 0 :(得分:2)

from element表示linq将循环遍历列表中的所有int,并且每个int都来自于被调用元素。

将其视为foreach循环。你现在写了这样的东西:

foreach(int element in list)
{
    if(element.Length > 10) // an int doesn't have a Length property
    {
        yield return element;
    }
}

我不确定你要用length属性实现什么,但这就是你写的。你能用长度属性描述你想要评估的内容吗?

答案 1 :(得分:1)

  1. 当您撰写from element in list时,您说要对list的每个元素进行枚举,因此element的类型为intLength类型上没有int属性存在。因此错误。

  2. 当您编写from element in list.Length时,您希望枚举单个项目,该项目是数组的长度,该项目的类型为int

答案 2 :(得分:1)

element是从数组int检索到的list。这不是数组本身。

由于int没有Length属性,因此无效。如果您要查找整数的位数,请查看此处:How can I get a count of the total number of digits in a number?

最终结果将是:

var list = new int[4];

var query1 = from element in list
             where (element == 0 ? 1 : Math.Floor(Math.Log10(Math.Abs(element)) + 1)) > 10
             select element;

答案 3 :(得分:1)

问题在于您的查询:

   var list = new int[4];

    var query1 = from element in list
                 where element.Length > 10
                 select element;

此处element是数组integer中的个人list,而不是int[]。很明显,Length类型不存在int

答案 4 :(得分:1)

编译器是对的:int没有Length属性(listint s的数组)。您是指int字符串表示吗?

var list = new int[4];
...

var query = list
  .Where(element => element.ToString().Length > 10) // note "ToString()"
  .Select(element);

请注意,该查询可能会返回an empty enumerable:大多数文化中int的最长字符串表示形式是-2147483648,其中正好是10位。如果你想要计数数字(例如-123有三位数) 您可以稍微修改一下查询:

var query = list
  .Where(element => element
    .ToString(CultureInfo.InvariantCulture)
    .Trim('-')
    .Length > 10) 
  .Select(element);

在这种情况下,你肯定有一个空结果。

答案 5 :(得分:0)

您的代码与此类似:

var list = new int[4];            
var filteredElements = new List<int>();
foreach (int element in list)
{
  if(element.Length > 10)
  {
    filteredElements.Add(element);
  }
}

这就是为什么你会收到错误&#39; int&#39;不包含&#39;长度&#39;的定义没有扩展方法