-1

名前付きオブジェクトのリストがあります:

class NamedObject {
    public string name;
    public int value;
    public NamedObject(string name, int value) {
        this.name = name;
        this.value = value;
    }
}

...

public static bool HasRelationship(NamedObject a, NamedObject b) {
    return a.value == b.value;
}

...

var objs = new List<NamedObject>();
objs.Add(new NamedObject("D", 1));
objs.Add(new NamedObject("Z", 2));
objs.Add(new NamedObject("Y", 3));
objs.Add(new NamedObject("A", 2));
objs.Add(new NamedObject("C", 1));
objs.Add(new NamedObject("Z", 1));

名前で並べ替えてから、ブール関係でサブソートしたいと思います。この例では、ブール関係はa.value == b.valueです。

出力リスト:

  • あ (2)
  • ズ (2)
  • し (1)
  • D (1)
  • ズ (1)
  • や (3)

したがって、名前で並べ替え、ブール関係でグループ化し、サブグループを名前で並べ替えます。

編集:

上記は実際の並べ替えを簡略化したものです。私のアプリケーションでは、このHasRelationship関数は 2 つの方向が対称かどうかを判断します。方向には、エディター インターフェイス内で論理的な順序で表示されるように名前が付けられています。

これが視覚化です:

http://pbrd.co/16okFxp

4

4 に答える 4

1

HasRelationshipメソッドには 2 つのオブジェクトが必要なので、リストに単独で参加する必要があると思います。

var result = objs.OrderBy(x => x.name)
            .Join(objs, _ => true, _ => true, (l, r) => new { l, r, rel = HasRelationship(l, r) })
            .Where(x => x.rel)
            .SelectMany(x=>new []{x.l,x.r})
            .Distinct()
            .ToList();

これは期待どおりのリストを返しますが、要件を明確に理解しているとは言えません。

于 2013-09-21T18:29:08.767 に答える
0
var sorted = objs.GroupBy(x => x.value, (k, g) => g.OrderBy(x => x.name))
                 .OrderBy(g => g.First().name)
                 .SelectMany(g => g);

メソッドを使用せずに、必要なものを正確に返しますHasRelationship

于 2013-09-21T16:30:18.187 に答える