个项目中的子组中的正在运行的项目数

本文关键字:运行 项目数 项目 | 更新日期: 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)])]