代码之家  ›  专栏  ›  技术社区  ›  cllpse

使用LINQ对一行中的一维实例数组应用操作

  •  3
  • cllpse  · 技术社区  · 14 年前

    考虑以下结构:

    internal struct Coordinate
    {
        public Double Top { get; set; }
        public Double Left { get; set; }
    }
    
    internal struct Dimension
    {
        public Double Height { get; set; }
        public Double Width { get; set; }
    }
    
    internal struct Property
    {
        public Boolean Visible { get; set; }
        internal String Label { get; set; }
        public String Value { get; set; }
        internal Coordinate Position { get; set; }
        public Dimension Dimensions { get; set; }
    }
    

    我需要操纵20个左右的 财产 财产 在一行代码里?

    我想的是:

    new []
    {
        InstanceOfProperty,
        InstanceOfProperty,
        InstanceOfProperty ...
    }.Each(p => p.Dimensions.Height = 100.0);
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   leppie    14 年前

    Each 采取措施 Action<T> 代表,你可以。

    事实上它不起作用。您正在使用值类型。有什么理由不可以吗 class

    两者 Dimension Property

        2
  •  1
  •   Thomas Levesque    14 年前

    Each 扩展方法,但由于对象是结构,因此无法使其在 IEnumerable<T> . 但是,您可以使用带有ref参数的委托创建一个在数组上工作的扩展方法:

    public static class ExtensionMethods
    {
        public delegate void RefAction<T>(ref T arg);
    
        public static void Each<T>(this T[] array, RefAction<T> action)
        {
            for(int i = 0; i < array.Length; i++)
            {
                action(ref array[i]);
            }
        }
    }
    
    ...
    
    new []
    {
        InstanceOfProperty,
        InstanceOfProperty,
        InstanceOfProperty ...
    }.Each((ref Property p) => p.Dimensions.Height = 100.0);
    

    但是自从 Dimension 也是一个结构,它不会以这种方式工作(编译器会检测到它并给您一个错误)。你必须这样做:

    new []
    {
        InstanceOfProperty,
        InstanceOfProperty,
        InstanceOfProperty ...
    }.Each((ref Property p) => p.Dimensions = new Dimension
                               {
                                   Width = p.Dimensions.Width,
                                   Height = 100.0
                               });
    

    总的来说,一切都会好起来的 很多 如果您的类型是类而不是结构,那么就更简单了。。。

        3
  •  0
  •   cllpse    14 年前

    new List<Property> { InstanceOfProperty, InstanceOfProperty, ... }.ForEach((p =>
    {
        p.Dimensions.Height = 0.0;
    }));
    


    注意:我已经将结构转换为类。如果我采用最初的基于结构的设计,我将不得不“更新”结构以改变它们的价值。像这样:

    new List<Property> { InstanceOfProperty, InstanceOfProperty, ... }.ForEach((p =>
    {
        p.Dimensions = new Dimension { Height = 0.0 };
    }));