Iterate each two-element combination in a HashSet

How could I repeat each combination of two elements in a HashSet once?

foreach (var elt1 in hashSet) {
  foreach (var elt2 in hashSet) {
    ...
  }
}

This will repeat the combinations of the two, but will repeat each TWICE combination. I would like to do it once.

I think this is easy to do in Python. Is there any way to do this in C #?

Example:

input hashSet: {1, 2, 3, 4}

(1), (1,3), (1,4), (2,3), (2,4), (3,4)
+4
source share
4 answers

There is no built-in method in C #. Since it is HashSet<T>not indexed * you cannot do this with two loops.

, ToList() ToArray(), :

var items = hashSet.ToList();
for (var i = 0 ; i != items.Count ; i++) {
    var a = items[i];
    for (var j = i+1 ; j != items.Count ; j++) {
        var b = items[i];
    }
}

- , IEnumerable<T>, :

static IEnumerable<Tuple<T,T>> MakeAllPairs<T>(this IEnumerable<T> data) {
    var items = data.ToList();
    for (var i = 0 ; i != items.Count ; i++) {
        var a = items[i];
        for (var j = i+1 ; j != items.Count ; j++) {
            var b = items[i];
            yield return Tuple.Create(a, b);
        }
    }
}

:

foreach (var pair in hashSet.MakeAllPairs()) {
    Console.WriteLine("{0} {1}", pair.Item1, pair.Item2);
}

* ElementAt<T>(int) Enumerable, .

+3

.

, ( ).

string[] myArray = GetArray();

for (int i = 0; i < myArray.Length - 1; i++)
{
    var element1 = myArray[i];

    for(int j = i + 1; j < myArray.Length; j++)
    {
        var element2 = myArray[j];
        Console.WriteLine("{0} {1}", element1, element2);
    }
}

: , :

Apple, Banana, Coconut, Zucchini

i = 0 (Apple), j 1 (), 2 (), 3 ()

i = 1 (), j 2 (Coconut), 3 (Zucchini).

...

, , j i. , ( j i), , .

. (Apple + Apple), :

    for(int j = i; j < myArray.Length; j++) //notice j = i instead of i + 1
+2

(, (1,2) (2,1)), SelectMany:

 var hashSet = new HashSet<int>{1,2,3,4,5,6,7,8};
 foreach (var elt in hashSet.SelectMany(
                     x => hashSet.Select(y => new Tuple<int, int>(x, y))))
 {
    Debug.WriteLine("{0}-{1}", elt.Item1, elt.Item2);
 }

. ( (1,2), (2,1)), :

 var hashSet = new HashSet<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
 foreach (var elt in hashSet.SelectMany(
                     x => hashSet.Where(y => y >= x)
                                 .Select(y => new Tuple<int, int>(x, y))))
 {
    Debug.WriteLine("{0}-{1}", elt.Item1, elt.Item2);
 }
0

HashSet. :

int int1, int2;
HashSet<int> hs = new HashSet<int>();
hs.Add(1);
hs.Add(2);
hs.Add(3);
for (int i = 0; i < hs.Count-1; i++) {
    int1 = hs.ElementAt<int>(i);
    for (int j = i + 1; j < hs.Count; j++)
    {
        int2 = hs.ElementAt<int>(j);
    }
}
0

Source: https://habr.com/ru/post/1537679/


All Articles