在下面的LINQ示例中,如何从组成的原始行中获取索引号列表?我想向用户显示数据的来源。
Dim inputDt As New DataTable
inputDt.Columns.Add("Contractor")
inputDt.Columns.Add("Job_Type")
inputDt.Columns.Add("Cost")
inputDt.Rows.Add({"John Smith", "Roofing", "2408.68"})
inputDt.Rows.Add({"John Smith", "Electrical", "1123.08"})
inputDt.Rows.Add({"John Smith", "Framing", "900.99"})
inputDt.Rows.Add({"John Smith", "Electrical", "892.00"})
Dim results = From rows In inputDt Where rows!Contractor <> ""
Group rows By rows!Job_Type
Into cost_total = Sum(CDec(rows!Cost))
For Each r In results
' Show results.
'r.Job_Type
'r.cost_total
' Show line numbers of original rows... ?
Next
对于结果(Job_Type =“Electrical”,cost_total = 2015.08),原始索引号为1和3.
由于
答案 0 :(得分:1)
首先,也许最重要的是,设置 ---------------------------------------------------------------------------
InvalidParameterValueException Traceback (most recent call last)
<ipython-input-2-9dd3ac986601> in <module>()
93 uploadId=multi_up['uploadId'],
94 range='bytes {}-{}/*'.format(lower, upper),
---> 95 body=upload)
96 upload_info.append(up_part)
97 checksum = calculate_tree_hash(upload)
~/anaconda/lib/python3.5/site-packages/botocore/client.py in _api_call(self, *args, **kwargs)
251 "%s() only accepts keyword arguments." % py_operation_name)
252 # The "self" in this scope is referring to the BaseClient.
--> 253 return self._make_api_call(operation_name, kwargs)
254
255 _api_call.__name__ = str(py_operation_name)
~/anaconda/lib/python3.5/site-packages/botocore/client.py in _make_api_call(self, operation_name, api_params)
555 error_code = parsed_response.get("Error", {}).get("Code")
556 error_class = self.exceptions.from_code(error_code)
--> 557 raise error_class(parsed_response, operation_name)
558 else:
559 return parsed_response
InvalidParameterValueException: An error occurred (InvalidParameterValueException) when calling the UploadMultipartPart operation:
Content-Range: bytes 0-33554431/* is incompatible with Content-Length: 1073745600
。这将不允许旧的VB6样式Option Strict On
类型表示法。但这是更好的,因为这种方式总是返回Object而数据很少。这完全没有损失,因为NET有更好的方法来输入和转换变量。
其次,有些相关,即所有rows!Cost
列都是文本,即使其中一列是十进制的。接下来,您的查询与使用表中的数据有关,但您还希望包含DataTable
属性,这有点奇怪。更好的方法是在数据中添加DataRow
或Id
作为标识符。如果View(行的顺序)发生变化,这也有助于结果。
您没有说明您是否需要CSV索引(现在是ID)或它们的集合。它们的CSV似乎更简单,所以这就是它的作用。
该代码还使用更多惯用名称,并使用其他扩展方法演示将数据转换为所需类型。它还使用扩展方法方法。首先是指定了非字符串数据类型的DataTable:
Number
然后查询:
Dim inputDt As New DataTable
inputDt.Columns.Add("ID", GetType(Int32))
inputDt.Columns.Add("Contractor")
inputDt.Columns.Add("JobType")
inputDt.Columns.Add("Cost", GetType(Decimal))
inputDt.Rows.Add({1, "John Smith", "Roofing", "2408.68"})
inputDt.Rows.Add({5, "John Smith", "Electrical", "1123.08"})
inputDt.Rows.Add({9, "John Smith", "Framing", "900.99"})
inputDt.Rows.Add({17, "John Smith", "Electrical", "892.00"})
过度滚动是不幸的,但我离开它以允许这些条款与&#34;等级&#34;他们在表演。如您所见,在Dim summary = inputDt.AsEnumerable().GroupBy(Function(g) g.Field(Of String)("JobType"),
Function(k, v) New With {.Job = k,
.Cost = v.Sum(Function(q) q.Field(Of Decimal)("Cost")),
.Indices = String.Join(",", inputDt.AsEnumerable().
Where(Function(q) q.Field(Of String)("JobType") = k).
Select(Function(j) j.Field(Of Int32)("Id")))
}).
OrderBy(Function(j) j.Cost).
ToArray()
' Debug, test:
For Each item In summary
Console.WriteLine("Job: {0}, Cost: {1}, Ids: {2}", item.Job, item.Cost, item.Indices)
Next
上运行单独的查询以获取匹配的指标。
写一个像
这样的东西更典型一些DataTable
但您可以使用this overload of GroupBy跳过SELECT,如上所述:
Dim foo = Something.GroupBy(...).Select(...)
结果:
工作:框架,成本:900.99,Ids:9
职位:电气,成本:2015.08,Ids:5,17
工作:屋顶,成本:2408.68,Ids:1