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...
}