Question

I have 2 list as below,

List<object>[] data = new List<object>[4];
List<HMData>[] Data_Content = new List<HMData>[7];
int indexer=0;

And also I have 3 list as LValues,IValues and BValues each containing 28 data values as follows

LValues={L1,L2,L3....L28},
IValues={I1,I2,I3...I28},
BValues={B1,B2,B3....B28},

foreach (var item in Read_xml_for_childobjects_id.Root.Descendants("object")) //  Contains 4 Items
  {
 for (int k = 0; k < 7; k++)
     {
       Data_Content[k] = new List<HMData>();
       Value_LfromList = LValues.ElementAt(k);
       Value_IfromList = IValues.ElementAt(k);
       Value_BfromList = BValues.ElementAt(k);

       Data_Content[k].Add(new HMData { x = Value_LfromList, y = Value_IfromList, z = Value_BfromList });
      }   
      data[indexer] = new List<object>(Data_Content);
      indexer++;
  }

now I want the output to be as follows,

data=[{L1,I1,B1},{L2,I2,B2},{L3,I3,B3},{L4,L4,B4},{L5,I5,B5},{L6,I6,B6},{L7,I7,B7}],
data=[{L8,I8,B8},{L9,I9,B9},{L10,I10,B10},{L11,I11,B11},{L12,I12,B12},{L13,I13,B13},{L14,I14,B14}],
data=[{L15,I15,B15},{L16,I16,B16},{L17,I17,B17},{L18,I18,B18},{L19,I19,B19},{L20,I20,B20},{L21,I21,B21}],
data=[{L22,I22,B22},{L23,I23,B23},{L24,I24,B24},{L25,I25,B25},{L26,I26,B26},{L27,I27,B27}{L28,I28,B28}].

Now if in for loop for k,if I take condition as for (int k = 0; k < 7; k++) then I get output as follows,

data=[{L1,I1,B1},{L2,I2,B2}.....{L7,I7,B7}],
data=[{L1,I1,B1},{L2,I2,B2}.....{L7,I7,B7}],
data=[{L1,I1,B1},{L2,I2,B2}.....{L7,I7,B7}],
data=[{L1,I1,B1},{L2,I2,B2}.....{L7,I7,B7}],

Since it encounters only first 7 elements of list each time the loop runs

And if I take for loop as for (int k = 0; k < 28; k++),since I have total 28 elements in each list, then after Data_Content list is filled with 7 elements since this is what I wanted and when 8 element is encountered then I get an error as

Index was outside of bounds of the array..

Any help will be greatly appreciated, I know I have placed two more questions on same problem but I doubt I was not able to explain my problem properly, I hope this question is clear,

-------updated question-------

 for (int k = 0; k < 4; k++)
  {
    for (int l = 0; l < 7; l++)
     { 
       Value_LfromList = LValues.ElementAt((k * 7) + l);
       Value_IfromList = IValues.ElementAt((k * 7) + l);
       Value_BfromList = BValues.ElementAt((k * 7) + l);
       Data_Content.Add(new HMData { x = Value_LfromList, y = Value_IfromList, z = Value_BfromList });
            }
        data.Add(Data_Content);
      }
   }

   var data_List = new { data = data };
   var series = new[] { data_List };
   var obj = new {chart,series };
   string result = jSearializer.Serialize(obj);

so the output I get is as follows,

{"chart":{"type":"bubble"},
 "series":
   [
      {"data":
         [
           {"x":7,"y":7,"z":49},{"x":7,"y":7,"z":49},{"x":7,"y":9,"z":63},
           {"x":5,"y":9,"z":45},{"x":4,"y":3,"z":12},{"x":2,"y":6,"z":12},
           {"x":3,"y":5,"z":15},{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
           {"x":7,"y":8,"z":56},{"x":9,"y":6,"z":54},{"x":5,"y":7,"z":35},
           {"x":3,"y":8,"z":24},{"x":4,"y":3,"z":12},{"x":7,"y":8,"z":56},
           {"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},{"x":8,"y":7,"z":56},
           {"x":5,"y":7,"z":35},{"x":3,"y":7,"z":21},{"x":5,"y":8,"z":40},
           {"x":3,"y":7,"z":21},{"x":3,"y":7,"z":21},{"x":5,"y":2,"z":10},
           {"x":5,"y":2,"z":10},{"x":8,"y":6,"z":48},{"x":7,"y":3,"z":21},
           {"x":6,"y":7,"z":42}
         ]
      }
   ]
 }

now output I want is as follows,

{"chart":{"type":"bubble"},
 "series":
   [
      {"data":
         [
           {"x":7,"y":7,"z":49},{"x":7,"y":7,"z":49},{"x":7,"y":9,"z":63},
           {"x":5,"y":9,"z":45},{"x":4,"y":3,"z":12},{"x":2,"y":6,"z":12},
           {"x":3,"y":5,"z":15}],

        "data":
         [
           {"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
           {"x":9,"y":6,"z":54},{"x":5,"y":7,"z":35},{"x":3,"y":8,"z":24},
           {"x":4,"y":3,"z":12}],

        "data":
         [
           {"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
           {"x":8,"y":7,"z":56},{"x":5,"y":7,"z":35},{"x":3,"y":7,"z":21},
           {"x":5,"y":8,"z":40}],

         "data":
         [
           {"x":3,"y":7,"z":21},{"x":3,"y":7,"z":21},{"x":5,"y":2,"z":10},
           {"x":5,"y":2,"z":10},{"x":8,"y":6,"z":48},{"x":7,"y":3,"z":21},
           {"x":6,"y":7,"z":42}
         ]
      }
   ]
 }..

I have to convert data I am getting into JSON format to plot graph and also data tag is mandatory...I hope I explain you...

-------Updated question-------

for (int k = 0; k < 4; k++)
  {
    List<HMData> Data_Content = new List<HMData>();
    for (int l = 0; l < 7; l++)
     {
       Value_LfromList = LValues.ElementAt((k * 7) + l);
       Value_IfromList = IValues.ElementAt((k * 7) + l);
       Value_BfromList = BValues.ElementAt((k * 7) + l);
       Data_Content.Add(new HMData { x = Value_LfromList, y = Value_IfromList, z = Value_BfromList });
     }
     data_list.Add(Data_Content);
   } 
   var chart = new
    {
      type = ChartType
    };
   var data = new { data = data_list };
   var series = new[] { data };
   var obj = new {chart,series };
   string result = jSearializer.Serialize(obj);

and this is my output

{"chart":{"type":"bubble"},"series":[{"data":[[{"x":7,"y":7,"z":49},
{"x":7,"y":7,"z":49},{"x":7,"y":9,"z":63},{"x":5,"y":9,"z":45},{"x":4,"y":3,"z":12},
 {"x":2,"y":6,"z":12},{"x":3,"y":5,"z":15}],
[{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
 {"x":7,"y":8,"z":56},{"x":9,"y":6,"z":54},{"x":5,"y":7,"z":35},{"x":3,"y":8,"z":24},
 {"x":4,"y":3,"z":12}],
[{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
 {"x":8,"y":7,"z":56},{"x":5,"y":7,"z":35},{"x":3,"y":7,"z":21},{"x":5,"y":8,"z":40}],
[{"x":3,"y":7,"z":21},{"x":3,"y":7,"z":21},{"x":5,"y":2,"z":10},{"x":5,"y":2,"z":10},
 {"x":8,"y":6,"z":48},{"x":7,"y":3,"z":21},{"x":6,"y":7,"z":42}]]}]}

--------Updated Required output-------

{"chart":{"type":"bubble"},"series":[
{"data":[[{"x":7,"y":7,"z":49},
{"x":7,"y":7,"z":49},{"x":7,"y":9,"z":63},{"x":5,"y":9,"z":45},{"x":4,"y":3,"z":12},
 {"x":2,"y":6,"z":12},{"x":3,"y":5,"z":15}],

 "data":[{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
 {"x":7,"y":8,"z":56},{"x":9,"y":6,"z":54},{"x":5,"y":7,"z":35},{"x":3,"y":8,"z":24},
 {"x":4,"y":3,"z":12}],


  "data":[{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},{"x":7,"y":8,"z":56},
 {"x":8,"y":7,"z":56},{"x":5,"y":7,"z":35},{"x":3,"y":7,"z":21},{"x":5,"y":8,"z":40}],


  "data":[{"x":3,"y":7,"z":21},{"x":3,"y":7,"z":21},{"x":5,"y":2,"z":10},{"x":5,"y":2,"z":10},
 {"x":8,"y":6,"z":48},{"x":7,"y":3,"z":21},{"x":6,"y":7,"z":42}]]}]}

I want data word to come with every data list in json output... which is not coming....

Was it helpful?

Solution

Your code is only psudo code and will not work. However, I think this is what you are trying to do and provided a working example.

internal class Program
{
    private static void Main(string[] args)
    {
        List<List<HMData>> data = new List<List<HMData>>();

        string[] Ls =
        {
            "L1", "L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9", "L10", "L11", "L12", "L13", "L14",
            "L15", "L16", "L17", "L18", "L19", "L20", "L21", "L22", "L23", "L24", "L25", "L26", "L27", "L28"
        };
        string[] Is =
        {
            "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9", "I10", "I11", "I12", "I13", "I14",
            "I15", "I16", "I17", "I18", "I19", "I20", "I21", "I22", "I23", "I24", "I25", "I26", "I27", "I28"
        };
        string[] Bs =
        {
            "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13", "B14",
            "B15", "B16", "B17", "B18", "B19", "B20", "B21", "B22", "B23", "B24", "B25", "B26", "B27", "B28"
        };

        for (int k = 0; k < 4; k++)
        {
            List<HMData> Data_Content = new List<HMData>();
            for (int j = 0; j < 7; j++)
            {
                var l = Ls.ElementAt((k*7) + j);
                var i = Is.ElementAt((k*7) + j);
                var b = Bs.ElementAt((k*7) + j);

                Data_Content.Add(new HMData {x = l, y = i, z = b});
            }

            data.Add(Data_Content);
        }

        foreach (var item in data)
        {
            Console.Write("data=[");
            for (int i = 0; i < 6; i++)
            {
                Console.Write("{0},",item[i]);
            }
            Console.WriteLine("{0}]", item[6]);

        }
        Console.ReadLine();

    }
}


public class HMData
{
    public string x;
    public string y;
    public string z;

    public override string ToString()
    {
        return string.Format("{{{0},{1},{2}}}", x, y, z);
    }
}

The output is: run example

------------------------------- EDIT FOR OP ---------------------------------- Note your code needs to have this:

for (int k = 0; k < 4; k++)
{
    List<HMData> Data_Content = new List<HMData>();
    ....
}

as i've said in the comments

OTHER TIPS

Here's a solution based on Linq operators rather than explicit iteration. It uses the Batch operator from the MoreLinq project - it's available on NuGet.

The line to zip the L, I and B-value sequences together is a little ugly, but .NET doesn't have a built in 3-argument sequence zip (zip got added in .NET 4.0, an alternative implementation is in MoreLinq for earlier versions). I'd probably implement my own extension method.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MoreLinq;

namespace ConsoleApplication1
{
    class Program
    {
        public class HMData     // Dummy HMDta class for test purposes
        {
            public string x { get; set; }
            public string y { get; set; }
            public string z { get; set; }
        }

        static void Main(string[] args)
        {
            var inputItems = new List<int>() { 1, 2, 3, 4 }; // Input items from XML document - dummy test list

            // L, I and B value sequences
            var LValues = new List<string>() { "L1", "L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9", "L10", "L11", "L12", "L13", "L14", "L15", "L16", "L17", "L18", "L19", "L20", "L21", "L22", "L23", "L24", "L25", "L26", "L27", "L28" };
            var IValues = new List<string>() { "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9", "I10", "I11", "I12", "I13", "I14", "I15", "I16", "I17", "I18", "I19", "I20", "I21", "I22", "I23", "I24", "I25", "I26", "I27", "I28" };
            var BValues = new List<string>() { "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13", "B14", "B15", "B16", "B17", "B18", "B19", "B20", "B21", "B22", "B23", "B24", "B25", "B26", "B27", "B28" };

            // Convert our 3 -value sequences into one sequence of HMData objects
            var zippedValues = LValues.Zip(IValues, (lvalue, bvalue) => Tuple.Create(lvalue, bvalue)).Zip(BValues, (pair, bvalue) => new HMData() { x = pair.Item1, y = pair.Item2, z = bvalue });

            // Split the sequence into length of length 7
            var batchedValues = zippedValues.Batch(7);

            // For each of the inputItems, output a batch from the -value sequences
            // (note we will stop output as soon as either the inputItems or the combined -value sequences are exhausted)
            var data = inputItems.Zip(batchedValues, (item, valueBatch) => valueBatch).ToArray();

        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top