Сравните одну строку со списком - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема. Я создал этот код, чтобы проверить, сколько общих ребер имеет моя формация треугольника:

public class TriangleRegistryList
{
    public float x1 { get; set; }
    public float y1 { get; set; }
    public float x2 { get; set; }
    public float y2 { get; set; }
    public float x3 { get; set; }
    public float y3 { get; set; }
    public int ShapeNum { get; set; }

    public TriangleRegistryList()
    {
        this.AdjacentShapeNumbers = new List<int>();
    }

    public List<int> AdjacentShapeNumbers { get; set; }

    public IEnumerable<(float x, float y)> GetPoints()
    {
        yield return (x1, y1);
        yield return (x2, y2);
        yield return (x3, y3);
    }

    public bool IsAdjacentTo(TriangleRegistryList other)
    {
        var isAdjacentTo =
                    GetPoints().Intersect(other.GetPoints()).Count() >= 2;
        if (isAdjacentTo)
        {
            if(other.ShapeNum != 0)
            {
                AdjacentShapeNumbers.Add(other.ShapeNum);
            }               
        }
        return isAdjacentTo;
    }
}

public static class EnumerableExtensions
{
    public static IEnumerable<(T first, T second)> GetPairs<T>(this IEnumerable<T> list)
    {
        return list.SelectMany((value, index) => list.Skip(index + 1),
                                (first, second) => (first, second));
    }
}

А потом я создаю список следующим образом:

triangles = new List<TriangleRegistryList>();

triangles.Add(new TriangleRegistryList
{
    x1 = (float)405,
    y1 = (float)701.4806,
    x2 = (float)675,
    y2 = (float)701.4806,
    x3 = (float)540,
    y3 = (float)935.3074
});

triangles.Add(new TriangleRegistryList
{
    x1 = (float)135,
    y1 = (float)701.4806,
    x2 = (float)405,
    y2 = (float)701.4806,
    x3 = (float)270,
    y3 = (float)935.3074
});

triangles.Add(new TriangleRegistryList
{
    x1 = (float)270,
    y1 = (float)935.3074,
    x2 = (float)540,
    y2 = (float)935.3074,
    x3 = (float)405,
    y3 = (float)701.4806
});

И, наконец, я вызываю метод, чтобы сравнить все стороны треугольника друг с другом. int sharedEdges = triangles.GetPairs().Where(t => t.first.IsAdjacentTo(t.second)).Count();

Это прекрасно работает, но теперь я хочу сравнить 1 треугольник со списком, чтобы я мог проверить, сколько общих ребер имеет 1 треугольник с формацией. Я уже создал этот цикл, но я не знаю, как продолжить:

foreach (TriangleRegistryList triangle in triangles)
{
    int sharedEdges = triangles.GetPairs().Where(t => t.first.IsAdjacentTo(t.second)).Count();
}

Как можно сравнить только 1 треугольник со списком, чтобы увидеть, сколько общих ребер имеет 1 треугольник с формацией?

1 Ответ

0 голосов
/ 20 мая 2019

Я бы полностью отделил концепцию Triangle.Попытка управлять свойствами точек треугольника и поддерживать соседнюю бухгалтерскую книгу в одном классе усложнит масштаб вашего кода.

Вот очень грубый план того, как вы могли бы начать работу в этом направлении:

public class Triangle
{
    public PointF Point1 { get; }
    public PointF Point2 { get; }
    public PointF Point3 { get; }

    public IEnumerable<PointF> Points => new List<PointF> { Point1, Point2, Point3 };

    public Triangle(PointF point1, PointF point2, PointF point3)
    {
        this.Point1 = point1;
        this.Point2 = point2;
        this.Point3 = point3;
    }

    public Triangle(float x1, float y1, float x2, float y2, float x3, float y3)
        : this(new PointF(x1, y1), new PointF(x2, y2), new PointF(x3, y3)) { }

    public bool IsAdjacentTo(Triangle other) => this.Points.Intersect(other.Points).Count() > 1;
}

public class TriangleRegistryList
{
    public IList<Triangle> Triangles { get; }
    public Dictionary<Triangle, List<Triangle>> AdjacentMap { get; }

    public TriangleRegistryList(IEnumerable<Triangle> triangles)
    {
        this.Triangles = new List<Triangle>(triangles);
        this.AdjacentMap = GetAdjacentMap();
    }

    private Dictionary<Triangle, List<Triangle>> GetAdjacentMap()
    {
        return Triangles.ToDictionary(t => t, a => Triangles.Where(b => b.IsAdjacentTo(a)).ToList());
    }
}

Это не проверено никакими средствами, но вы видите разделение каждого соответствующего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...