1

我有两个形状的列表 - 矩形和圆形。它们都共享 3 个共同属性 - ID、Type 和 Bounds

圆有 2 个额外的属性 - 范围和中心

我如何将每种类型的列表加入一个列表中,这样我就可以遍历它们,这样我就不必输入两个 foreach 循环

这可以以比合并列表更好的方式完成吗?

public interface IRectangle
{
    string Id { get; set; }
    GeoLocationTypes Type { get; set; }
    Bounds Bounds { get; set; }
}

public class Rectangle : IRectangle
{
    public string Id { get; set; }

    public GeoLocationTypes Type { get; set; }

    public Bounds Bounds { get; set; }
}


public interface ICircle
{
    string Id { get; set; }
    GeoLocationTypes Type { get; set; }
    Bounds Bounds { get; set; }
    float Radius { get; set; }
    Coordinates Center { get; set; }
}

public class Circle : ICircle
{
    public string Id { get; set; }

    public GeoLocationTypes Type { get; set; }


    public Bounds Bounds { get; set; }

    public float Radius { get; set; }

    public Coordinates Center { get; set; }
}

public class Bounds
{
    public Coordinates NE { get; set; }

    public Coordinates SW { get; set; }
}

public class Coordinates
{
    public float Lat { get; set; }

    public float Lng { get; set; }
}
4

5 回答 5

6

制作两者IRectangleICircle从共享类型继承 - 说IShape

然后AList<IShape>将能够采用任何IRectangleICircle类型及其继承类型。

由于IRectangleICircle共享许多属性,您可以这样做:

public interface IShape
{
    string Id { get; set; }
    GeoLocationTypes Type { get; set; }
    Bounds Bounds { get; set; }
}

public interface ICircle : IShape
{
    float Radius { get; set; }
    Coordinates Center { get; set; }
}

public interface IRectangle : IShape
{
}
于 2012-07-13T16:16:48.410 回答
5

创建一个包含公共属性的接口IShape,然后实现它以及 ICircle 和 IRectangle。(您也可以使用具有这些属性的基类)。

您应该能够加入 Circles 和 Rectangles 列表以获取 IShapes 列表。

于 2012-07-13T16:16:47.460 回答
3

您可以进一步添加一个接口

public interface IShape
{
    string Id;
    GeoLocationTypes Type;
    Bounds Bounds;
}
于 2012-07-13T16:16:31.983 回答
2

您可以让它们每个都使用 IShape 接口,或者您可以迭代对象并进行转换。

public interface IShape
{
    string Id { get; set; }
    GeoLocationTypes Type { get; set; }
    Bounds Bounds { get; set; }
}

public interface IRectangle : IShape { }

public class Rectangle : IRectangle
{
    // No change
}


public interface ICircle : IShape
{
    float Radius { get; set; }
    Coordinates Center { get; set; }
}

public class Circle : ICircle
{
    // No change
}

public class Bounds
{
    // No change
}

public class Coordinates
{
    // No change
}

还有一个Zip函数可以让你枚举所有这些。

一个例子:

var numbers= new [] { 1, 2, 3, 4 };
var words = new [] { "one", "two", "three" };

var numbersAndWords = numbers.Zip(words, (n, w) => new { Number = n, Word = w });
foreach(var nw in numbersAndWords)
{
    Console.WriteLine(nw.Number + nw.Word);
}
于 2012-07-13T16:17:43.100 回答
1

这个怎么样

var merged = Rectagles.Select(r => new { 
        r.Id, 
        r.Type, 
        r.Bounds,
        Radius = float.NaN,
        Centre = default(Coordinates) })
    .Concat(Circles.Select(c => new {
        c.Id, 
        c.Type, 
        c.Bounds,
        c.Radius,
        c.Centre }));

它给出了公开所需信息的匿名类型的可枚举列表。


编辑

令我惊讶的是,这实际上似乎可以编译。所以有一个解决方案可以在不定义通用接口的情况下工作。然而,除了快速和肮脏之外,我会考虑多态而不是匿名。

于 2012-07-13T16:22:29.690 回答