代码之家  ›  专栏  ›  技术社区  ›  Caspar Kleijne

旋转数组集合

  •  2
  • Caspar Kleijne  · 技术社区  · 15 年前

    IValueCollection .

    public interface IValueCollection : IEnumerable<decimal>
    {
        decimal this[int index] { get; set; }
    }
    

    MeasurementCollection.Values 属于类型 IValueCollection公司 .

    按照下面的逻辑,我想重点介绍 IValueCollection公司 并在下面编写了扩展方法。

    public static IEnumerable<IValueCollection> PivotValues(this MeasurementCollection items)
    {
        if(items.IsQuantized())
        {
            int s = (int)items.First().Template.Frequency;
            int c = items.Count;
            for (int n = 0; n < s; n++)
            {
                IValueCollection v = new MeasurementValueCollection(c);
                for (int m = 0; m < c; m++)
                    v[m] = items.ElementAt(m).Values[n];
                yield return v;
            }
        }
    }
    

    {{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; }    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Reed Copsey    15 年前

    我个人会提前强制评估你的收藏,并将其用作数组。现在,每次你打电话 ElementAt ,你要评估 IEnumerable<T> 再次,造成了大量的重复搜索。

    通过强制它预先对数组求值,可以简化整个过程。比如:

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

    如果你能控制 MeasurementValueCollection ,我会添加一个构造函数 IEnumerable<decimal>

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