个项目中的子组中的正在运行的项目数
本文关键字:运行 项目数 项目 | 更新日期: 2023-09-27 18:26:43
假设我有
IEnumerable< IEnumerable< string > > rowsOfTextColumns
内部ienumerable字符串值表示一行中的列,因此外部ienumerable存储几行文本列。类似:3行乘4列:
12345 foo 2014-10-16 09:55 blah
12345 foo 2014-10-16 09:55 bleh
67890 bar 2014-10-16 09:58 ugh
DateTime列的值不是唯一的——正如您在示例中看到的,可能同时有多个条目。但在我的数据中使用日期时间作为ID是最有意义的。由于我希望每一行都有一个唯一的ID,我想在每一行中添加一列"动态",其中包含从具有相同日期时间的条目中出现的次数,从1开始。像这样:
12345 foo 2014-10-16 09:55 blah (1)
12345 foo 2014-10-16 09:55 bleh (2)
67890 bar 2014-10-16 10:21 ugh (1)
(为了澄清:唯一id将是datetime+datetime子组中的运行编号的组合)
当然,我知道如何用的方式来做这件事。但是,这是如何最优雅地完成的,例如使用C#的LINQ/函数式编程方面?此外,我很好奇,在F#中,如何才能最优雅地做到这一点?
编辑#1:更好地说明了源数据格式
编辑#2:好吧,按照一条评论中的建议,使用groupby,到目前为止我得到了这个(在C#中,看看我为F#代码选择的答案):
var groupsByDatetime = rowsOfColumns.GroupBy( rec => rec.ElementAt(2) );
var extendedRows =
groupsByDatetime.SelectMany( g =>
g.Select( (columns,i) =>
columns.Concat( new[]{(1+i).ToString()} ) ) );
有人出价更少?:)嗯,我想看起来还不算太糟。
这会对项目进行分组,并映射每个项目以将其索引包含在组中。
let groupAndIndexItems keySelector =
Seq.groupBy keySelector
>> Seq.map (fun (key, items) ->
let indexedItems = items |> Seq.mapi (fun i x -> x, i)
key, indexedItems
)
示例用法:
[
12345, "foo", "2014-10-16 09:55", "blah"
12345, "foo", "2014-10-16 09:55", "bleh"
67890, "bar", "2014-10-16 09:58", "ugh"
]
|> groupAndIndexItems (fun (_, _, s, _) -> s)
输出:
val it : seq<string * seq<(int * string * string * string) * int>> =
seq
[("2014-10-16 09:55",
seq [((12345, "foo", "2014-10-16 09:55", "blah"), 0);
((12345, "foo", "2014-10-16 09:55", "bleh"), 1)]);
("2014-10-16 09:58",
seq [((67890, "bar", "2014-10-16 09:58", "ugh"), 0)])]