为什么不允许Array.Count作为自己的索引值?

时间:2014-02-27 00:10:21

标签: c# sorting generic-list arrays indexer

我需要按字母顺序排序值(invoice_no / invoiceNum)。我有以下代码:

string beginningInvoiceNum = string.Empty;
string endingInvoiceNum = string.Empty;
. . .
XDocument doc = XDocument.Parse(stringifiedXML);
var DeliveredItems = doc.Descendants("DSD").Select(delItem => new
{
    lineID = delItem.Element("line_id").Value,
    invoiceNum = delItem.Element("invoice_no").Value,
    UPCCode = delItem.Element("upc_code").Value,
    desc = delItem.Element("description").Value,
. . .
}).ToList(); 

string[] invNums = new string[DeliveredItems.Count];
int i = 0;
foreach (var delItem in DeliveredItems)
{
    invNums[i] = delItem.invoiceNum;
    i++;
}
Array.Sort(invNums);
beginningInvoiceNum = invNums[0];
//endingInvoiceNum = invNums[invNums.Count - 1]; <= this does not work
endingInvoiceNum = invNums[DeliveredItems.Count-1]; // <= this works

...但正如您在评论中看到的那样,我最初尝试使用字符串数组的计数失败了;我被责备给我错误的错误msg“运算符' - '不能应用于'方法组'和'int'类型的操作数

什么?!? invNums.Count与DeliveredItems.Count不一样吗?为什么后者在前者失败时起作用?

更新

所以我的代码就是这样:

beginningInvoiceNum = invNums.First();
endingInvoiceNum = invNums.Last();

......我很高兴作为一个未经烘烤的蛤蜊。

3 个答案:

答案 0 :(得分:8)

invNums是数组,它没有Count属性(如list)。您应该使用其Array.Length属性

invNums[invNums.Length - 1]

或IEnumerable的Enumerable.Count()扩展(实际上编译器认为您正在尝试使用此扩展,但是您尝试使用方法组而不是执行方法):

invNums[invNums.Count() - 1]

实际上在后一种情况下,您可以使用Enumerable.Last()扩展名:

invNums.Last()

答案 1 :(得分:2)

错误消息是由Array.Count引用Count扩展方法引起的,就好像它是属性一样,即没有括号。术语“方法组”是错误消息中的线索。

正如谢尔盖所​​写,使用invNums.Length - 1

答案 2 :(得分:2)

因为 DeliveredItems 列表&lt;&gt;

所以它可以通过

来计算
DeliveredItems.Count

invNums 字符串数组

因此我们通过

获得数组计数
invNums.Count()

但不是 invNums.Count因为后者只是方法。

结论是,invNums.Count(方法)与DeliveredItems.Count(int)不同。