0

この質問をどのように表現すればよいか完全にはわかりません。リストの各要素を同じリストの各要素と1回だけ比較するにはどうすればよいですか。

例えば:

var textlist = ["a", "b", "c"];
var intersecting = from string a in textlist
                   from string b in textlist
                   where a != b && a.SomeCondition(b)
                   select new
                   {
                       object1 = a,
                       object2 = b
                   };

「a」が「b」で「SomeCondition」に「True」を与えると仮定すると、最終結果は次のようになります。

[["a, b"]]

今では次のようになります。

[["a, b"], ["b, a"]]

これはLinqクエリで可能ですか?

4

4 に答える 4

2

値の比較を使用できます。つまり、a > b のペアのみを処理します。不等式が暗示されるため、 youra != bをに置き換えることもできます。a > b

var textlist = ["a", "b", "c"];
var intersecting = from string a in textlist
               from string b in textlist
               where a > b && (a.SomeCondition(b) || b.SomeCondition(a))
               select new
               {
                   object1 = a,
                   object2 = b
               };
于 2012-08-06T01:56:24.830 に答える
1

1つの方法は、各要素をその後にある要素だけと比較することです。

string[] textlist = {"a", "b", "c"};
var intersecting = from aIndex in Enumerable.Range(0, textlist.Count())
                   from b in textlist.Skip(aIndex + 1)
                   let a = textlist.ElementAt(aIndex)
                   where a != b && a.SomeCondition(b)
                   select new
                   {
                       object1 = a,
                       object2 = b
                   };

注:このソリューションは、LINQを使用するこの問題のほとんどのソリューションとともに、列挙にコストがかかるIEnumerableで使用すると、ひどく非効率になります。

于 2012-08-06T03:19:48.157 に答える
1

条件を追加することで、希望する結果が得られましたCompareTo

string[] textlist = new string[] {"a", "b", "c"};
var intersecting =  from string a in textlist
                    from string b in textlist
                    where ((a != b) && (a.CompareTo(b) == -1)) // && a.SomeCondition(b)
                    select new { object1 = a, object2 = b }
                    ;

intersecting.Dump("Result");

ここに結果のスクリーンショットがあります

ここに画像の説明を入力

//余分なものを削除して、条件のコメントを外すことができます。

于 2012-08-06T02:27:59.873 に答える
0

オブジェクト間で > を使用できない場合、またはコレクションに重複が含まれる可能性がある場合に備えて、別の方法を次に示します。コレクション内のアイテムにインデックスを渡す SelectMany と Where のオーバーロードを使用して機能します。それほど読みにくいことはわかっていますが、より堅牢だと思います。

        string[] data = "A,A,B,C".Split(',');
        var query = data.SelectMany((x1, i1) => data.Where((x2, i2) => i2 > i1 && x1.SomeCondition(x2)).Select(x2 => new { object1 = x1, object2 = x2 }));
        foreach (var item in query) Console.WriteLine(item.object1 + "," + item.object2);
于 2012-08-06T03:38:18.723 に答える