Jeśli jesteś ustawiony na korzystanie z aktualnych danych strukturę, możesz to zrobić, ale składnia nie będzie ładna. Zasadniczo przypomina to to, co A. Milto zasugerował w swojej odpowiedzi, z wyjątkiem tego, że potrzebujesz sprawdzania granic, aby uniknąć wyrzucenia wyjątku w przypadku pustej ścieżki. Więc jeśli zdefiniować ścieżki tak:
var arrayPaths = new List<int[,]>();
arrayPaths.Add(new[,] { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Include: starts with (0, 0)
arrayPaths.Add(new[,] { { 0, 1 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Include: starts with (0, 1)
arrayPaths.Add(new[,] { { 1, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Exclude: starts with (1, 0)
arrayPaths.Add(new int[0,0]); // Exclude: has no data
następnie podzbiór ścieżek, które rozpoczynają się w punkcie (0, 0) i (0, 1) to:
arrayPaths.Where(p =>
p.GetUpperBound(0) >= 0 &&
p.GetUpperBound(1) >= 1 &&
(
(p[0, 0] == 0 && p[0, 1] == 0) ||
(p[0, 0] == 0 && p[0, 1] == 1)
));
Neville Nazerane miał dobrą sugestię w swoim komentarzu: użycie struktury danych innej niż tablica liczb całkowitych do przedstawienia punktu powinno dać kod, który jest znacznie łatwiejszy do zrozumienia.Na przykład, załóżmy, że definiowanie współrzędnych tak:
public struct Coordinate
{
public Coordinate(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
public bool Equals(int x, int y) =>
X == x && Y == y;
}
Następnie można zdefiniować zestaw ścieżek wyżej podane tak:
var objectPaths = new List<List<Coordinate>>();
objectPaths.Add(new List<Coordinate> { new Coordinate(0, 0), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) });
objectPaths.Add(new List<Coordinate> { new Coordinate(0, 1), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) });
objectPaths.Add(new List<Coordinate> { new Coordinate(1, 0), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) });
objectPaths.Add(new List<Coordinate>());
a teraz podzbiór ścieżek jesteś zainteresowany jest :
objectPaths.Where(p => p.Count > 0 && (p[0].Equals(0, 0) || p[0].Equals(0, 1)));
Jeśli chcesz bardziej zwięzłej składni dla określenia ścieżki w kodzie, wtedy można rozważyć bardzo prostą klasę reprezentuje ścieżkę. Na przykład:
public class Path : List<Coordinate>
{
public Path() { }
public Path(params (int x, int y)[] coordinates) =>
AddRange(coordinates.Select(c => new Coordinate(c.x, c.y)));
}
Teraz można zdefiniować zbiór ścieżek jak:
var paths = new List<Path>();
paths.Add(new Path((0, 0), (0, 1), (1, 1), (2, 1)));
paths.Add(new Path((0, 1), (0, 1), (1, 1), (2, 1)));
paths.Add(new Path((1, 0), (0, 1), (1, 1), (2, 1)));
paths.Add(new Path());
a składnię wybranie podzbioru chciałeś jest taka sama jak poprzednio.
skoro są to ścieżki i zawsze miałbyś 2, czy rozważałeś posiadanie klasy współrzędnych z dwoma właściwościami? –
masz na myśli coś w rodzaju 'x [0] [0] == 0 && x [0] [1] == 1'? –
@NevilleNazerane, który nie byłby najlepszy, gdyby była inna opcja, ponieważ już używałem tej listy 'path' w innych częściach kodu, ponieważ jest to –