2012-07-13 2 views
1

두 개의 도형 - 직사각형과 원 목록이 있습니다. 그들은 모두 주 3 일반 속성 - ID, 유형과 범위C# 반복을 위해 두 개의 다른 목록 집합을 결합하십시오.

원 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; } 
} 
+0

먼저 Circle과 Rectangle을 'IShape'(인터페이스에서 파생 됨)로 변환 할 것을 권장합니다. 지금 가지고 계시므로, 원과 직사각형은 공통점이 없습니다. –

+0

"더 나은"정의하십시오. 더 효율적입니까? 유지/읽기가 더 쉽습니까? 그들이 별도의 목록에 올 이유가 있습니까?좀 더 추상적 인 객체 유형에서 다른 모양으로 내려 가서 <추상 형식> 목록을 사용할 수 있지만 참조해야 할 경우보다 일반적인 목록을 반복 할 때 올바른 특정 하위 클래스로 객체를 캐스팅해야합니다. 그들의 특성. 목록 ... 기린, 하이에나, 얼룩말 등을 포함합니다. – Tim

답변

6

IRectangleICircle 모두 공유 유형 (예 : IShape)에서 상속됩니다.

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 
{ 
} 
+0

롤 - 위대한 마음과 모든 것! –

+2

@JonEgerton - 예, 질문과 OOP 상속 문학은 거의이 응답을 보장합니다.) – Oded

+0

Q : 목록을 훑어보기로 이동하면 어떻게됩니까? IShape의 속성 만 볼 수 있습니다. IRectangle의 속성에 액세스하려면 어떻게해야합니까? 나는 한 번의 반복을 반복했다. – Aviatrix

3

당신은 또한, 그뿐만 아니라 ICircle 및 IRectangle 구현하는 일반적인 속성을 포함하는 인터페이스 IShape을 확인하는 인터페이스

public interface IShape 
{ 
    string Id; 
    GeoLocationTypes Type; 
    Bounds Bounds; 
} 
5

을 추가 할 수 있습니다. (속성을 가진 기본 클래스를 사용할 수도 있습니다).

이클립스 목록을 가져 오려면 서클 및 사각형 목록에 가입 할 수 있어야합니다.

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 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 })); 

에 대해이 필요한 정보를 노출하는 익명 형식의 열거의 목록을 제공하는 방법

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); 
} 
1

. 내 놀랍게도


편집

이 실제로 컴파일 것으로 보인다. 공통 인터페이스를 정의하지 않고도 작동하는 솔루션이 있습니다. 그러나 아무것도하지만 신속하고 더러운 나는 익명 이상의 다형을 고려할 것이다.

관련 문제