本文整理汇总了C#中IReadOnlyList.Stream方法的典型用法代码示例。如果您正苦于以下问题:C# IReadOnlyList.Stream方法的具体用法?C# IReadOnlyList.Stream怎么用?C# IReadOnlyList.Stream使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IReadOnlyList
的用法示例。
在下文中一共展示了IReadOnlyList.Stream方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateCircuitAnimation
public static Animation CreateCircuitAnimation(double span,
TimeSpan duration,
IReadOnlyList<CircuitOperationWithStyle> ops,
IReadOnlyList<CircuitInputWithStyle> ins,
string desc,
IReadOnlyList<string[][]> wireLabels = null,
string[] stateLabels = null,
bool showMatrix = true,
double wireSpace = 80)
{
var matrixFill = (Brush)Brushes.Orange.LerpToTransparent(0.5);
var vals = ins.Select(e => ops.Stream(e.Value, (a, x) => x.Operation*a, streamSeed: true).ToArray()).ToArray();
var numOp = ops.Count;
var numIn = ins.Count;
var maxIn = numOp + 1;
var numState = ins.First().Value.Values.Count;
var numWire = (int)Math.Round(Math.Log(numState, 2));
var matrixWidth = 150.0;
var cellRadius = matrixWidth / (vals[0][0].Values.Count + 2) / 2;
var matrixRadius = matrixWidth / 2;
var opXs = numOp.Range().Select(i => -cellRadius+span*(i+0.75)/maxIn).ToArray();
var sweepX = Ani.Anon(t => new Point(t.DividedBy(duration).LerpTransition(-cellRadius * 2, span - cellRadius * 2), 0).Sweep(new Vector(0, 1000)));
var opTs = opXs.Select(x => new {s = duration.Times((x - matrixRadius + cellRadius*2)/span), f = duration.Times((x + matrixRadius)/span)}).ToArray();
var wireYs = numWire.Range().Select(i => numWire == 1 ? 20 + wireSpace/2 : (wireSpace / 2 + i * wireSpace / 2 / (numWire - 1))).ToArray();
var animation = new Animation {
// top description
new TextDesc(desc,
new Point(span/2.0 - (numOp == 1 ? cellRadius : 0), 5),
new Point(0.5, 0),
fontSize: 15,
foreground: Brushes.Gray),
// wires
wireYs.Select(y => new LineSegmentDesc(new Point(0, y).Sweep(new Vector(span+300, 0))))
};
if (showMatrix) {
// static matrices
animation.Add(
numOp.Range()
.Select(i => ShowMatrix(
new Rect(opXs[i] - matrixRadius, wireSpace+20, matrixRadius*2, matrixRadius*2),
ops[i].Operation,
matrixFill,
Brushes.Black)));
}
var offsetTimelines =
ins.Count.Range()
.Select(
i => animation
.Dilated(
1.Seconds(),
-duration.DividedBy(ins.Count).Times(i))
.Periodic(duration))
.ToArray();
// sweep line
foreach (var p in offsetTimelines) {
p.Add(new LineSegmentDesc(sweepX, Brushes.Red, 0.5, 4));
}
// state labels
var tts = opTs.Select(e => e.s.LerpTo(e.f, 0.4));
var wd = numIn.Range().Select(inid => numWire.Range().Select(wid => (numOp + 1).Range().Select(tid => {
var label = wireLabels == null ? new[] {"On", "Off"} : wireLabels[wid][tid];
var p = numState.Range().Where(i => ((i >> wid) & 1) == 0).Select(i => vals[inid][tid].Values[i].SquaredMagnitude()).Sum();
if (p < 0.001) return label[1];
if (p < 0.01) return string.Format("~{0}", label[1]);
if (p < 0.49) return string.Format("~{0}:{1:0}%", label[1], (1 - p) * 100);
if (p > 0.999) return label[0];
if (p > 0.99) return string.Format("~{0}", label[0]);
if (p > 0.51) return string.Format("~{0}:{1:0}%", label[0], p * 100);
return string.Format("{0}/{1}", label[0], label[1]);
}).ToArray()).ToArray()).ToArray();
foreach (var i in numIn.Range()) {
foreach (var j in numWire.Range()) {
animation.Add(
new TextDesc(
Ani.Anon(t => (t + duration.DividedBy(numIn).Times(i)).Mod(duration))
.Select(t => wd[i][j][tts.TakeWhile(c => t >= c).Count()]),
Ani.Anon(
t =>
new Point((t.DividedBy(duration) + i * 1.0 / numIn).ProperMod(1).LerpTransition(-cellRadius * 2, span - cellRadius * 2), wireYs[j]))));
}
}
// matrix multiplications
if (showMatrix) {
foreach (var i in numIn.Range()) {
foreach (var j in numOp.Range()) {
var p = offsetTimelines[i].LimitedNewTime(opTs[j].s, opTs[j].f);
var r = new Rect(opXs[j] - matrixRadius, wireSpace + 20, matrixRadius * 2, matrixRadius * 2);
p.Add(
ShowMatrixMultiplication(
opTs[j].f - opTs[j].s,
//.........这里部分代码省略.........