我需要按字母顺序排序值(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();
......我很高兴作为一个未经烘烤的蛤蜊。
答案 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)不同。