Home > Mobile >  How do I display a list and a list of lists side by side
How do I display a list and a list of lists side by side

Time:01-24

I found a code that displays two lists side by side but a list and a list of lists no luck

this is the code of two lists side by side

for (var i = 0; i < bncount; i  )
{
  //Console.WriteLine(String.Format("{0,-10} | {1,-10}", hed.ElementAt(i),bin.ElementAt(i)));
  Console.WriteLine(String.Format("{0,-10} | {1,-10}", i< hdcount ? hed[i] : string.Empty, i< bncount ? bin[i] : string.Empty));          
}

but the string.empty is for lists only and not list of lists and ElementAt() also wouldn't work I tried using linq with foreach but no success

the hed is a list of strings and bn is a list of lists of a sequence of numbers

my output are as follows

foreach(var r in bin) //0010 1110 1111
foreach(var m in hed) //red blue white 

I want to have the following output

red 0010
blue 1110
white 1111

or

red   blue  white
 0     1      1     
 0     1      1     
 1     1      1
 0     0      1  

Any Idea on how to do this in c# in general or in Linq? the methods I tried either resulted on reprinting one value only froma hed and all the vlaues from bin or the opposite

CodePudding user response:

I would suggest using a different structure for storing your data (considering OOP principles) and the following code for printing the data out:

public class Item
{
    public string Name { get; set; }
    public List<int> Values { get; set; }
}

public void Print(List<Item> items)
{
    foreach (var item in items)
    {
        Console.WriteLine($"{item.Name} {string.Join("", item.Values)}");
    }
}

CodePudding user response:

Not sure if I understood the question correctly, I think it would be helpful to extend the code examples including the variables definition. Anyway, if I understood correctly, this would me my approach:

var listOfString = new List<string>( )
{
    "red",
    "blue",
    "white"
};

var listOfArrays = new List<int[]>( )
{
    new int[] { 0,0,1,0 },
    new int[] { 0,1,1,1 },
    new int[] { 1,1,1,1 }
};

// Here you could add a condition in case you are not 100% sure your arrays are of same length.
for( var i = 0; i < listOfString.Count; i   )
{
    var stringItem = listOfString[i];
    var arrayItem = listOfArrays[i];

    Console.WriteLine( $"{stringItem} {string.Join( null, arrayItem )}" );
}

CodePudding user response:

The first version is not so hard:

string reuslt = string.Join("\n", bin.Zip(hed).Select(x => $"{x.Item1} {x.Item2}"));

With zip, we create an enumerable of tuples, where the n-th tuple has the n-th element of bin and the n-th element of hed. You can just concatenate those two items.

The second version is a bit more complex:

result = string.Join("\t",hed)   "\n"   
       string.Join("\n",Enumerable.Range(0, bin.First().Length)
             .Select(x => string.Join("\t\t", bin.Select(str => str[x]))));

We create the heading line by just joing the hed strings. Then we create an enumerable of numbers which represent the indexes in the string. The enumerable will be 0, 1, 2, 3. Then we take the char with index 0 of each string of the bin list, then the char with index 1 of each string of the bin list and so on.

Online demo: https://dotnetfiddle.net/eBQ54N

CodePudding user response:

You can use a dictionary:

        var hed = new List<string>(){"red", "blue", "white"};
        var bin = new List<string>(){ "0010", "1110", "1111" };
        Dictionary<string, string> Dic = new Dictionary<string, string>();
        for (int i = 0; i < hed.Count; i  )
        {
            Dic.Add(hed[i],bin[i]);
        }

        foreach (var item in Dic)
        {
            Console.WriteLine(item.Key " " item.Value);
        }

        Console.ReadKey();
  •  Tags:  
  • Related