Hello all...my first official post (after the introduction)

I'm relatively new in the area of C# (some PHP experience) and I'm hoping someone can help me.

I have 2 arrays of variable lengths, with int data in them. Something like this:

FreeNumbers = 1,2,3,4,5
UsedNumbers = 1,2

I want to take the first FreeNumber (1) and search through the used number array. If it exists there I want to move on to the next FreeNumber (2) and do the same. Once I find a FreeNumber (3) that is NOT in the UsedNumber array, I want to assign it to another var (TheNextFreeNumber).

Can someone help me with this? I was thinking this should be done through For's, ForEach or Try/Catch but I'm just not quite getting there. Maybe there is an even simpler C# function?

Thanks for any help.

-Chris

Dani AI

Generated

Short summary and a couple of practical refinements tied to the thread: wanted the first value from FreeNumbers that does not appear in UsedNumbers. pointed out using generics (List<T>) and the OP used AddRange + a foreach/Contains loop to find the first free value. That works fine for small one‑off checks, but there are cleaner and faster alternatives worth considering.

A concise, fast approach is to build a lookup (HashSet) from the used values and then pick the first free via LINQ. This avoids repeated O(n) list scans and keeps intent clear:

var usedSet = new HashSet<int>(UsedNumbers);
int nextFree = FreeNumbers.FirstOrDefault(n => !usedSet.Contains(n));

Notes and tradeoffs:

  • Complexity: building the HashSet is O(m), scanning FreeNumbers is O(n) — overall O(n + m). The foreach+List.Contains approach is O(n * m) worst case. For ~300 elements both are trivial, but HashSet scales much better for larger data or repeated calls.
  • FirstOrDefault returns 0 when nothing is found, so handle the “not found” case explicitly (use DefaultIfEmpty(-1).First() or throw if 0 is a valid number).
  • Enumerable.Except(UsedNumbers).FirstOrDefault() is an alternative that does set-difference; it removes duplicates and preserves the order of the first sequence.
  • If this selection must be atomic across requests (web/multi-threaded scenario), reserve the number in a shared store or use a lock/transaction so two threads don't pick the same value.

Finally, remember to persist or add the selected number to the used collection (as ’s sample did) if you intend to reserve it; the OP’s final snippet printed the value but did not mark it used.

Recommended Answers

All 4 Replies

Can you use generics? They are a little easier to deal with than arrays:

private void simpleButton2_Click(object sender, EventArgs e)
    {
      List<int> free = new List<int>();
      List<int> used = new List<int>();
      free.AddRange(new int[] { 1, 2, 3, 4, 5, 6 });
      used.AddRange(new int[] { 2, 3 });

      int nextNumber = GetNextFreeNumber(free, used);
      System.Diagnostics.Debugger.Break();
    }
    private int GetNextFreeNumber(List<int> free, List<int> used)
    {
      foreach (int i in free)
      {
        if (used.Contains(i))
          continue;
        else
        {
          used.Add(i);
          return i;
        }
      }
      throw new Exception("out of free number");
    }

I haven't used generics before. The arrays are already built and filled. Is there an easy way to move the aray data to the generics? There are about 300 elements per array.

-Chris

Yes:

private void simpleButton2_Click(object sender, EventArgs e)
    {
      int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7 };
      List<int> lst = new List<int>();
      lst.AddRange(numbers); //adds the array to the generic list

That Got It! Thank you so much! Plus I learned about Generics for the first time. Will study up more on that.

Here's the code I used in the end for those interested:

List<int> free = new List<int>();
List<int> used = new List<int>();
free.AddRange(FreeNumbers); //adds the array to the generic list
used.AddRange(UsedNumbers); //adds the array to the generic list

foreach (int i in free)
	{
	if (used.Contains(i))
	continue;
	else
		{
		Response.Write("<hr>");
		Response.Write(i);					
		Response.Write(" is the next available number<hr>");		
		break;
		}
	}

Now one more question...why didn't I join Daniweb sooner? :-)

Thanks again

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.