I know that there are combinatoric libraries for this kind of thing. However, with me being new to C# and coding in general I found that I couldn't understand the code well enough to implement it in my solution.

The code below represents my solution to the problem in question. It works but I feel like I reinvinted the wheel on this one. Is there a better way of going about it than what I have?

[Challenge Prompt][1]

Given two integers: **L** and **R**,

find the maximal values of A xor B given, **L** ≤ A ≤ B ≤ **R**

**Input Format** 
The input contains two lines, L is present in the first line. 
R in the second line.


**Constraints** 
1 ≤ L ≤ R ≤ 10<sup>3</sup>

**Output Format** 
The maximal value as mentioned in the problem statement.


**Sample Input**#00
   

     1
     10

**Sample Output**#00

    15

<br>
**Sample Input**#01

    10
    15


**Sample Output**#01

    7

<br>
Explanation for the second example is as follows:

In the second sample let's say **L**=10, **R**=15, then all pairs which comply to above condition are 

**10⊕10=0 <br> 
10⊕11=1 <br>
10⊕12=6 <br>
10⊕13=7 <br>
10⊕14=4 <br>
10⊕15=5 <br>
11⊕11=0 <br>
11⊕12=7 <br>
11⊕13=6 <br>
11⊕14=5 <br>
11⊕15=4 <br>
12⊕12=0 <br>
12⊕13=1 <br>
12⊕14=2 <br>
12⊕15=3 <br>
13⊕13=0 <br>
13⊕14=3 <br>
13⊕15=2 <br>
14⊕14=0 <br>
14⊕15=1 <br>
15⊕15=0** 

Here two pairs (10,13) and (11,12) have maximum xor value 7 and this is the answer.
<br>

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
 
 
    class Solution {
 
 	    public static List<int[]> Combinations( List<int> number_list ) 
        {
        
    		// We are only choosing 2 values out of any list of numbers
            int[] TwoList = new int[2]; 
 
            List<int[]> result = new List<int[]>();
 
            List<int> stack = new List<int>(number_list);                    
                    
            while (stack.Count > 0) 
            {
 
            	int StackLast = stack.Count - 1;
 
            	for (int i =0; i < stack.Count; i++) 
                {
            		TwoList[0] = stack[StackLast];
 
            		TwoList[1] = stack[i];
 
            		result.Add(new int[] {TwoList[0], TwoList[1]});
            	}
            	stack.RemoveAt(StackLast);
            }
            
            return result;
 
        }
    
        static int MaxXor(int l, int r) 
        {
                
            List<int> NumList = new List<int>(Enumerable.Range(l, r - l + 1));
 
            // Inserts the list combinations as int arrays
            List<int[]> comboList = Combinations(NumList); 
 
            int max = 0;
 
            foreach(var two in comboList)
            {
        	
        	    int XorValue = two[0] ^ two[1];
 
        	    max = ( max > XorValue )? max : XorValue;
            }
        
            return max;
        }
 
        static void Main(String[] args) 
        {
 
            int _l;
            int _r;
 
            _l = Convert.ToInt32(Console.ReadLine());
             
            _r = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine(MaxXor(_l, _r));
        }
    }


  [1]: https://www.hackerrank.com/challenges/maximizing-xor