3

だから私は( , , are )のようにフォーマットされたListofを持っています。私は3次元空間にポイントを持っています。私は LINQ を使用して、私のポイントからいくつかのラジオ( )にあるすべてのアイテムを取得したいと考えています。LINQでそのようなことを行う方法は?string{itemname}-{x}-{y}-{z}xyztypeof(int)xyzListRtypeof(int)

4

3 に答える 3

4

これを2つのタスクに分割します。

  • 文字列をより便利な形式に解析する
  • 距離によるフィルタリング

したがって、クエリは次のようになります。

var query = values.Select(text => ItemPoint.Parse(text))
                  .Where(item => item.DistanceFrom(point) < radius);

(本当にテキストフォームに戻る必要がある場合は、解析時にアイテムに保存して、Select後で別の呼び出しを行うことができます。)

これで、簡単に分離できるメソッドを作成できます:ItemPoint.Parse(string)ItemPoint.DistanceFrom(Point)これらの方法のいずれかに問題がある場合は、詳細を示す別の質問を作成してください。ただし、LINQはおそらく無関係です。

(解析部分については、使用を検討することをお勧めしますstring.Split。)

于 2012-07-30T17:00:51.327 に答える
1

LINQ関連の関連部分は次のとおりです。

// List of strings formated like {itemname}-{x}-{y}-{z}
List<string> test = new List<string>
{
    "name1-1-1-2",
    "name2-0-1-2",
    "name3-0-0-3"
};

var res = test
    .Select(tmp =>
        {
            string[] items = tmp.Split('-');
            return new
                {
                    x = int.Parse(items[1]),
                    y = int.Parse(items[2]),
                    z = int.Parse(items[3])
                };
        })
    .Where(tmp => (tmp.x + tmp.y + tmp.z) < 4)  // Insert the right math formula here.
    .ToList();

実際の数式については、グーグルで検索するか、SOで検索してください。2つの3次元ポイント間の距離を計算するためのアルゴリズム?

于 2012-07-30T17:01:19.997 に答える
1

以下は、匿名型のインスタンスを構築して座標と解析されていない値をWhere句までグループ化し、座標を切り捨てて解析されていない値を取得する方法の例です。

var itemPoints = new List<string> {
    "quick-1-2-3"
,   "brown-11-22-13"
,   "fox-10-42-33"
,   "jumps-19-23-31"
};
int x0=2, y0=1, z0=0, rSquare = 25;
var itemNames = itemPoints.Select(
    s => {
        var tt = s.Split('-');
        return new {
            Unparsed = s
        ,   x = int.Parse(tt[1])
        ,   y = int.Parse(tt[2])
        ,   z = int.Parse(tt[3])
        };
    }
).Where(p => (p.x-x0)*(p.x-x0)+(p.y-y0)*(p.y-y0)+(p.z-z0)*(p.z-z0) < rSquare)
.Select(p => p.Unparsed)
.ToList();

距離の式は、平方根を取るコストを回避するためにデカルト距離の式の両辺を二乗します。

于 2012-07-30T17:08:09.970 に答える