Вы можете сделать это следующим образом:
var all = new [] {
new Cls(1, 9)
, new Cls(2, 9)
, new Cls(3, 15)
, new Cls(4, 15)
, new Cls(5, 15)
, new Cls(6, 30)
, new Cls(7, 9)
};
var f = all.First();
var res = all.Skip(1).Aggregate(
new List<Run> {new Run {From = f.SequenceNumber, To = f.SequenceNumber, Value = f.Value} }
, (p, v) => {
if (v.Value == p.Last().Value) {
p.Last().To = v.SequenceNumber;
} else {
p.Add(new Run {From = v.SequenceNumber, To = v.SequenceNumber, Value = v.Value});
}
return p;
});
foreach (var r in res) {
Console.WriteLine("{0} - {1} : {2}", r.From, r.To, r.Value);
}
Идея состоит в том, чтобы творчески использовать Aggregate
: начиная со списка, состоящего из одного Run
, проверьте содержимое списка, до сих пор на каждом этапе агрегации (утверждение if
в лямбда). В зависимости от последнего значения, продолжайте старый запуск или запустите новый.
Вот демон g0 на ideone .
Вам необходимо использовать: Generics , $ Diff и Hoc Definition :
import * as React from 'react';
type TComponent = {
pass: string,
inject: string
}
const TestComponent = ({pass, inject}: TComponent) => <span>{pass}{inject}</span>
type THocDiff = {
take: string
}
type TInjectInHoc = {
inject: string
};
const Hoc = <T: {}>(Component: React.AbstractComponent<T>): React.AbstractComponent<$Diff<T, TInjectInHoc> & THocDiff> => {
return class extends React.Component<T & THocDiff> {
render(){
const { take, ...props} = this.props;
return(
<Component {...props} inject="inject" />
)
}
}
}
const WrappedComponent = Hoc<TComponent>(TestComponent)
const using = () => (<WrappedComponent pass="123" take='take' />)