2016-11-10 2 views
2

Ich habe einen Code in C#, wo ich den Benutzer für die Anzahl der Sätze, die er erstellen möchte, und geben Sie dann Elemente in diesen Sets. Aus diesen Mengen wählt er 2 Mengen aus und zeigt eine Vereinigung der ausgewählten Mengen an.Anzeige Union von 2 Sets in C#

Im folgenden Code werden die Elemente in den Sets nicht zu _items hinzugefügt und die Union wird nicht angezeigt.

Danke für jede Hilfe.

namespace Union 
{ 

    class Program 
    { 
    static List<SortedSet<string>> _items = new List<SortedSet<string>>(); 
    static SortedSet<string> set = new SortedSet<string>(); 

    static void Main(string[] args) 
    { 
     int i, j, a, b; 
     string k; 
     Console.WriteLine("\n Enter the number of set to be used: "); 
     i = Convert.ToInt32(Console.ReadLine()); 
     for (j = 1; j <= i; j++) 
     { 
      SortedSet<string> set = new SortedSet<string>(); 
      do 
      { 
       Console.WriteLine("Enter first element in set {0}:", j); 
       k = Console.ReadLine(); 
       if (k != "stop") 
        set.Add(k); 
      } while (k != "stop"); 
      _items.Add(set); 
     } 
     Console.WriteLine("Enter index of 1st set of union:{0}"); 
     b = Convert.ToInt32(Console.ReadLine()); 
     Console.WriteLine("Enter index of 2nd set of union:{0}"); 
     c = Convert.ToInt32(Console.ReadLine()); 
     DisplayUnion(a, b); 
    } 

    public static void DisplayUnion(int a, int b) 
    { 
     SortedSet<string> set1 = _items[a]; 
     SortedSet<string> set2 = _items[b]; 
     set1.UnionWith(set2); 
     Console.WriteLine(set1); 
    } 
    } 
} 

Antwort

1

Voll durch meine Antwort bearbeitet Main() und DisplayUnion(int a, int b) Methoden, Modifikation bessere Darstellung zu erreichen und Grenz-Case-Szenarien umfassen. Main() Methode:

static void Main(string[] args) 
{ 
    int i, j, a, b; 
    string k; 
    Console.WriteLine("Enter the number of sets to be used: "); 
    i = Convert.ToInt32(Console.ReadLine()); 
    for (j = 1; j <= i; j++) 
    { 
     SortedSet<string> set = new SortedSet<string>(); 
     var index = 0; 
     do 
     { 
      index++; 
      Console.WriteLine($"Enter {index} element in set {j}:"); 
      k = Console.ReadLine(); 
      if (k != "stop") 
       set.Add(k); 
     } while (k != "stop"); 
     _items.Add(set); 
    } 

    if (_items.Count == 0) 
    { 
     Console.WriteLine("You have no sets to union."); 
     return; 
    } 

    if (_items.Count == 1) 
    { 
     Console.WriteLine("Union of only set is: " + string.Join("", _items[0])); 

     return; 
    } 

    while (true) 
    { 
     Console.WriteLine("Enter index of 1st set of union:{0}"); 
     a = Convert.ToInt32(Console.ReadLine()); 
     if (a < _items.Count) 
     { 
      break; 
     } 

     Console.WriteLine($"Set {a} does not exists."); 
    } 

    while (true) 
    { 
     Console.WriteLine("Enter index of 2nd set of union:{0}"); 
     b = Convert.ToInt32(Console.ReadLine()); 
     if (b < _items.Count) 
     { 
      break; 
     } 

     Console.WriteLine($"Set {b} does not exists."); 
    } 

}

DisplayUnion(int a, int b) Methode:

public static void DisplayUnion(int a, int b) 
{ 

    SortedSet<string> set1 = _items[a]; 
    SortedSet<string> set2 = _items[b]; 
    set1.UnionWith(set2); 
    Console.WriteLine($"Union of set {a + 1} with set {b + 1} is: " + string.Join("", set1)); 
} 

Sie erhalten outOfRangeException weil Sie ungültigen Index für einen Satz eingeben, ohne überall zu überprüfen, ob es tatsächlich invalid.I gelöst, dass durch Zugabe von Hinzufügen von zwei while cycles. Auch ich habe zwei if statements für Grenzfälle, wenn Sätze 0 oder 1 sind.

Ich hoffe, es hilft.

+0

Aber ich bekomme immer noch einen Fehler in _items [a], dass die Ausnahme außerhalb des Bereichs wurde nicht behandelt ... –

+0

Der Grund dafür ist, dass Sie nirgendwo nach ungültigen Index suchen. Siehe die Änderung. –