:
var resutSet =
paths.Where(e => e.SliceRow(0).SequenceEqual(firstCriteria.Cast<short>()) ||
e.SliceRow(0).SequenceEqual(secondCriteria.Cast<short>())).ToList();
resultSet
は今、すなわち与えられた基準を満たす2つの多次元配列を含んでいるでしょう構造体であれば、これを行うことができますが、構文はそれほど美しくはありません。基本的にA. Miltoが答えてくれたようですが、空のパスの場合には例外を投げるのを避けるために境界チェックが必要です。あなたはそのようなあなたのパスを定義するのであれば:
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
その後で起動パスのサブセット(0、0)、または(0、1)である:
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)
));
ネヴィルNazeraneは良い提案を持っていました彼のコメントでは、整数の配列以外のデータ構造を使って点を表現すると、コードがはるかに理解しやすくなります。
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;
}
次に、あなたはこのように上に与えられたパスの集合を定義することができます:
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>());
をそして今、あなたが興味を持っているパスのサブセットであるたとえば、あなたがそうのような座標を定義すると:
objectPaths.Where(p => p.Count > 0 && (p[0].Equals(0, 0) || p[0].Equals(0, 1)));
コードでパスを指定するためのより簡潔な構文が必要な場合は、パスを表す非常に簡単なクラスと考えることができます。例えば:
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)));
}
今、あなたはとパスのセットを定義することができます
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());
そして、あなたが望んでいたサブセットを選択するための構文は、以前と同じです。
これらはパスであり、常に2であるため、2つのプロパティを持つ座標クラスがあると考えていますか? –
'x [0] [0] == 0 && x [0] [1] == 1'のような意味ですか? –
@NevilleNazeraneこれは別のオプションがある場合には最適ではないでしょう。私は既にこの 'path'リストをそのままコードの他の部分に使用しています –