1

長方形と円の2つの形状のリストがあります。これらは両方とも、ID、タイプ、および境界の3つの共通のプロパティを共有します。

円には、範囲と中心の2つの追加プロパティがあります

各タイプのリストを1つのリストに結合して、それらを反復処理できるようにするには、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

その後、 Aは任意のタイプとそれらの継承タイプList<IShape>を取得できるようになります。IRectangleICircle

IRectangleとは両方ともICircle多くのプロパティを共有しているため、次のことができます。

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を実装します。(プロパティを持つ基本クラスを使用することもできます)。

サークルと長方形のリストに参加して、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 に答える