C# 旋转数组集合
基本上,我有一个对象集合,每个对象实现一个C# 旋转数组集合,c#,linq,arrays,extension-methods,C#,Linq,Arrays,Extension Methods,基本上,我有一个对象集合,每个对象实现一个IValueCollection类型的成员 public interface IValueCollection : IEnumerable<decimal> { decimal this[int index] { get; set; } } 应该做 {1,2,3}{4,5,6}{7,8,9}导致{1,4,7},{2,5,8},{3,6,9} 然而,我认为有一些更好、更苗条、更易读的表达方式可以做到这一点 谁能给我指一下正确的方向吗
IValueCollection
类型的成员
public interface IValueCollection : IEnumerable<decimal>
{
decimal this[int index] { get; set; }
}
应该做
{1,2,3}{4,5,6}{7,8,9}
导致{1,4,7},{2,5,8},{3,6,9}
然而,我认为有一些更好、更苗条、更易读的表达方式可以做到这一点
谁能给我指一下正确的方向吗
编辑
有关基础类的信息
interface IValueCollection : IEnumerable<decimal>
class MeasurementCollection : ICollection<IMeasurement>
interface IMeasurement
{
IMeasurementTemplate Template { get; }
......
}
interface IMeasurementTemplate
{
.....
MeasurementFrequency Frequency { get; }
}
接口集合:IEnumerable
类度量集合:ICollection
接口测量
{
IMeasurementTemplate模板{get;}
......
}
接口IMeasurementTemplate
{
.....
测量频率频率{get;}
}
我个人会提前强制评估您的收藏,并将其用作阵列。现在,每次调用时,都要再次计算IEnumerable
,导致大量重复搜索
通过强制它预先对数组求值,可以简化整个过程。比如:
public static IEnumerable<IValueCollection> PivotValues(this MeasurementCollection items)
{
if(items.IsQuantized())
{
int elementLength = (int)items.First().Template.Frequency;
var itemArray = items.ToArray();
for (int n = 0; n < itemArray.Length; n++)
{
IValueCollection v = new MeasurementValueCollection(elementLength);
for (int m = 0; m < elementLength; m++)
{
v[m] = itemArray[m].Values[n];
}
yield return v;
}
}
else
yield break; // Handle the case where IsQuantized() returns false...
}
public static IEnumerable<IValueCollection> PivotValues(this MeasurementCollection items)
{
if(items.IsQuantized())
{
int elementLength = (int)items.First().Template.Frequency;
var itemArray = items.ToArray();
for (int n = 0; n < itemArray.Length; n++)
{
IValueCollection v = new MeasurementValueCollection(elementLength);
for (int m = 0; m < elementLength; m++)
{
v[m] = itemArray[m].Values[n];
}
yield return v;
}
}
else
yield break; // Handle the case where IsQuantized() returns false...
}
public static IEnumerable<IValueCollection> PivotValues(this MeasurementCollection items)
{
if(items.IsQuantized())
{
var elements = Enumerable.Range(0, (int)items.First().Template.Frequency);
var itemArray = items.ToArray();
foreach(var element in elements)
yield return new MeasurementValueCollection(
itemArray.Select(
(item,index) => itemArray[index].Value[element]
)
);
}
else
yield break; // Handle the case where IsQuantized() returns false...
}