I'm familiar with C. Where I can write like this:
uint array[0xFFFF][20];
But I've no idea how to do this in Csharp. I tried all MS tutorials and other tutorials but no luck.
Can someone please help me out?
Official tutorial. Basically you create the "outer" array first, and then loop trough it, and create each "inner"array individually.
Two examples:
int[][] a = new int[] { new int[]{ 1, 2 }, new int[]{ 3, 4, 5, 6, 7 }};
int[][] c = new int[100][];
for (int i = 0; i < c.length; i++) c[i] = new int[5];
If you need only a 2D rectangular array, you can use int[,] b = new int[10, 7];.
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
or
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
See Jagged Arrays (C# Programming Guide)
I don't know that in C but in c# you can use jagged arrays like:
// Declare local jagged array with 3 rows.
int[][] jagged = new int[3][];
// Create a new array in the jagged array, and assign it.
jagged[0] = new int[2];
jagged[0][0] = 1;
jagged[0][1] = 2;
// Set second row, initialized to zero.
jagged[1] = new int[1];
// Set third row, using array initializer.
jagged[2] = new int[3] { 3, 4, 5 };
// Print out all elements in the jagged array.
for (int i = 0; i < jagged.Length; i++)
{
int[] innerArray = jagged[i];
for (int a = 0; a < innerArray.Length; a++)
{
Console.Write(innerArray[a] + " ");
}
Console.WriteLine();
}
http://www.dotnetperls.com/jagged-array
I think this may help you
static void Main(string[] args)
{
Console.WriteLine("enter the size of rows");
int n = Convert.ToInt32(Console.ReadLine());
int[][] a = new int[n][];
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine("enter the number of elements for row {0}", i + 1);
int x = Convert.ToInt32(Console.ReadLine());
a[i]=new int[x];
for (int j = 0; j < a[i].Length; j++)
{
a[i][j] = Convert.ToInt32(Console.ReadLine());
}
}
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < a[i].Length; j++)
{
Console.Write(a[i][j]+"\t");
}
Console.WriteLine();
}
Console.ReadKey();
}
namespace jaggedarray
{
class Program
{
static void Main(string[] args)
{
int[][] jagged = new int[5][];
jagged[0] = new int[4] { 22, 33,44,55 };
jagged[1] = new int[1] { 2 };
jagged[2] = new int[4] { 1, 2, 3, 4 };
jagged[3] = new int[2] { 12,13};
jagged[4] = new int[1] {2};
for (int i = 0; i < jagged.Length; i++ ) {
for (int j = 0; j < jagged[i].Length; j++)
{
Console.Write("\t{0}",jagged[i][j]);
}
Console.WriteLine();
Console.WriteLine();
}
// input jagged array
int [][] arrays=new int[5][];
Console.WriteLine("Please Enter the ValueType to make a jagged array:");
arrays[0] = new int[1];
arrays[1] = new int[2];
arrays[2]=new int [3];
arrays[3]=new int [4];
arrays[4] = new int[5];
for (int i = 0; i < arrays.Length;i++ ) {
for (int j = 0; j < arrays[i].Length; j++)
{
arrays[i][j] = Convert.ToInt32(Console.ReadLine());
}
}
Console.WriteLine("This is jagged array::");
for (int i = 0; i < arrays.Length;i++ ) {
for (int j = 0; j < arrays[i].Length;j++ ) {
Console.Write("\t{0}", arrays[i][j]);
}
Console.WriteLine();
}
}
}
}
creating and displaying element of jagged array
int[][] a = new int[2][];//its mean num of row is 2 which fixed
int choice;//thats i left on user choice that how many number of column in each row he wanna to declare
for (int row = 0; row < a.Length; row++)
{
Console.WriteLine("pls enter number of colo in row {0}", row);
choice = int.Parse(Console.ReadLine());
a[row] = new int[choice];
for (int col = 0; col < a[row].Length; col++)
{
a[row][col] = int.Parse(Console.ReadLine());
}
}
//loop for out put the values of jagged array
for (int row = 0; row < a.Length; row++)
{
for (int col = 0; col < a[row].Length; col++)
Console.Write(a[row][col]+"\t");
Console.WriteLine("");
}
here in inserting loop i used
a[row].length
instead of
a.length,
the reason behind is that every row have different number of columns so that way in second loop you have to mentioned the length of each row
Related
An array of arrays is given. It is necessary to find the minimum element in each column and write the data to a new array. I have done the following implementation, in accordance with the given conditions. But I am having a problem:expected minimum element in each column of the array are incorrect. Where am I making a mistake?
class Program
{
static int[][] Input()
{
Console.Write("n = ");
int n = int.Parse(Console.ReadLine());
int[][] a = new int[n][];
//int[] minA = new int[n];
for (int i = 0; i < n; ++i)
{
a[i] = new int[n];
for (int j = 0; j < n; ++j)
{
Console.Write("a[{0},{1}]= ", i, j);
a[i][j] = int.Parse(Console.ReadLine());
}
}
return a;
}
static void Print(int[] a)
{
foreach (double elem in a)
{
Console.Write("{0} ", elem);
}
}
static void Print2(int[][] a)
{
for (int i = 0; i < a.Length; ++i, Console.WriteLine())
for (int j = 0; j < a[i].Length; ++j)
Console.Write("{0,5} ", a[i][j]);
}
static int[] F(int[][] a)
{
int[] b = new int[a[1].Length];
for (int j = 0; j < a[1].Length; j++)
{
int tempmin = a[0][j];
for (int i = 0; i < a[0].Length; i++)
{
if (a[j][i] <= tempmin)
{
tempmin = a[j][i];
b[j] += tempmin;
}
}
}
return b;
}
static void Main()
{
int[][] myArray = Input();
Print2(myArray);
int[] b = new int[myArray.Length];
b = F(myArray);
Print(b);
}
}
I suggest looping over all lines, while tracking all min columns values:
using System.Linq; // for the final `ToArray()`
...
private static int[] MinColumns(int[][] data) {
if (null == data)
throw new ArgumentNullException(nameof(data));
// List of columns' mins; initially the list is empty
List<int> list = new List<int>();
// for each line (not column!) within jagged array...
foreach (int[] line in data) {
// let's just skip null lines (alternative is to throw exception)
if (null == line)
continue;
// each new line can update columns' max values.
// now we update each column
for (int c = 0; c < line.Length; ++c)
// if index c is too big, i.e.
// the line is too long and some columns appear first time...
if (c >= list.Count)
// ...we just add values of such columns as columns' min
for (int i = list.Count; i <= c; ++i)
list.Add(line[i]);
else
// otherwise we update min values: we compare known min and current value
list[c] = Math.Min(list[c], line[c]);
}
// finally, we convert list into array with ahelp of Linq
return list.ToArray();
}
Note, that here we ignore all holes, e.g. for
int[][] demo = new int[][] {
new int[] {1, 2, 3, 4},
new int[] {5, 6}, // <- hole: we don't have 3d and 4th columns here
new int[] {7, 0, 8},
};
the answer will be {Min(1, 5, 7), Min(2, 6, 0), Min(3, 8), Min (4)} = {1, 0, 3, 4}
Edit: Usage is quite direct; something like this (fiddle yourself)
static void Main()
{
// Get jagged array
int[][] myArray = Input();
// Print it
Print2(myArray);
// Get max for each column
int[] b = MinColumns(myArray);
// Print these maxes
Print(b);
}
I am trying to create an array of 6 arrays each containing 4 arrays, each of those 4 arrays with different shape.
Like in the form below:
[[array([[1,2,3,4,6,5],
[5,6,6,7,7,5],
[6,6,5,5,6,5],
[4,6,6,7,7,5],
[5,6,6,7,7,5],
[6,6,5,5,6,5],
[6,6,5,5,6,5],]),
array([[9,9,9],
[9,9,9],
[6,6,6],
[3,3,6],
[6,6,6]]),
array([[6],
[7],
[7],
[7],
[7]]),
array([[7,8,8,8,8]])],
[[array([[1,2,3,4,6,5],
[5,6,6,7,7,5],
[6,6,5,5,6,5],
[4,6,6,7,7,5],
[5,6,6,7,7,5],
[6,6,5,5,6,5],
[6,6,5,5,6,5],]),
array([[9,9,9],
[9,9,9],
[6,6,6],
[3,3,6],
[6,6,6]]),
array([[6],
[7],
[7],
[7],
[7]]),
array([[7,8,8,8,8]])]]
..........
I have this code but I am doing something wrong, I do not get the desired shape.
Can somebody please help me with this?
int populationSize = 6;
double[][][][] population = new double[populationSize][][][];
int value = 3;
for (int i = 0; i < populationSize; i++)
{
population[i] = new double[4][][];
for (int j = 0; j < 4; j++)
{
const int rows = 7, cols = 6;
population[i][j] = new double[rows][];
for (int k = 0; k < rows; k++)
{
population[i][j][k] = new double[cols];
for (int m = 0; m < cols; m++)
{
population[i][j][k][m] = value;
}
}
}
}
const int rows = 7, cols = 6;
population[j][j] = new double[5][];
for (int k = 0; k < rows; k++)
you are using the same indexes for population[j][j], that is probably incorrect.
You are also specifying 7 rows, but create a matrix of size 5. That is probably incorrect.
As Scopperloit points out, you probably want:
const int rows = 7, cols = 6;
population[i][j] = new double[rows][];
for (int k = 0; k < rows; k++)
Overall when debugging problems. Run the code in a debugger and inspect the values against your expectations. Index out of range exceptions are usually very easy to debug:
What is the index?
What is the length of the array?
Is the index or array length incorrect?
I managed to solve my problem.
THis function creates an array of arrays of arrays of different shapes according to another array, and fills it with random normal standard distribution values :
int[,] netshape = new int[,] { { 3, 4}, { 4, 5}, { 4, 1 }, { 1, 4} }; // The shape of the network
public double[][][][] CreateNetwork(int[,] netshape,int populationSize )
{
normal = new MathNet.Numerics.Distributions.Normal(0, 1);// Generate random normal standard distribution
int rows, cols ;
double[][][][] population = new double[populationSize][][][];
for (int i = 0; i < populationSize; i++)
{
population[i] = new double[4][][];
for (int j = 0; j < 4; j++)
{
rows = netshape[j, 0];
cols = netshape[j, 1];
population[i][j] = new double[rows][];
for (int k = 0; k < rows; k++)
{
population[i][j][k] = new double[cols];
for (int m = 0; m < cols; m++)
{
population[i][j][k][m] = normal.Sample(); ;
}
}
}
}
return population;
}
I am trying to randomize a sett of predetermine elements in a 2d array.
using System;
namespace array
{
public class tiles
{
static void Main(string[] args)
{
Random random = new Random();
int[,] tilearr = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(tilearr[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}
My problem is if I do something like tilearr[i, j] = random.Next(0, 8); it randomizes the array but doesn't care if there are any duplicates of the same element.
2 6 7
1 1 3
2 7 0
what I am after is more like this:
2 4 8 1 3 0
0 3 1 5 6 8
6 7 5, 2 4 7
A simple and to the point solution would be to have a list of available numbers and then go position by position and randomly select the numbers out of the list.
Like this:
var numbers = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
for(int x = 0; x < 3; ++x) {
for(int y = 0; y < 3; ++y) {
// select a random number from the list ...
int rand = random.Next(0, numbers.Count - 1);
tilearr[x, y] = numbers[rand];
// ... and remove it from the list
numbers.RemoveAt(rand);
}
}
As user Wai Ha Lee stated in the comments a shuffle will achieve what you are looking for. I would recommend the Fisher Yates Shuffle.
public static void Shuffle<T>(Random random, T[,] array)
{
int lengthRow = array.GetLength(1);
for (int i = array.Length - 1; i > 0; i--)
{
int i0 = i / lengthRow;
int i1 = i % lengthRow;
int j = random.Next(i + 1);
int j0 = j / lengthRow;
int j1 = j % lengthRow;
T temp = array[i0, i1];
array[i0, i1] = array[j0, j1];
array[j0, j1] = temp;
}
}
I retrieved this implementation from this answer.
This should be implemented in your code like this,
using System;
namespace array
{
public class tiles
{
static void Main(string[] args)
{
Random random = new Random();
int[,] tilearr = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
Shuffle<int>(random, tilearr);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(tilearr[i, j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
}
Make sure to place the shuffle generic function within your class.
HERE is an example of my implementation on dotnetfiddle.net.
If you generate the array from scratch, it's easier to randomize a one dimensional array, and then load it into a 2D array.
static int[,] GenerateArray(int size)
{
Random r = new Random();
var arr = new int[size, size];
var values = Enumerable.Range(0, size * size).OrderBy(x => r.Next()).ToArray();
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
arr[i, j] = values[i * size + j];
return arr;
}
One way to Randomize would be flatten the 2d array, shuffle it and then recreate based on original dimension. If you want to use Linq/Extension methods, you could do the following
Random random = new Random();
int[,] tilearr = {{ 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }};
var result = tilearr.OfType<int>()
.OrderBy(x=> random.Next())
.ChunkBy(tilearr.GetLength(1))
.To2DArray();
Where ChunkBy and To2DArray are defined as
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> ChunkBy<T>(this IEnumerable<T> source, int chunkSize)
{
return source
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / chunkSize)
.Select(x => x.Select(v => v.Value));
}
public static T[,] To2DArray<T>(this IEnumerable<IEnumerable<T>> source)
{
var data = source
.Select(x => x.ToArray())
.ToArray();
var res = new T[data.Length, data.Max(x => x.Length)];
for (var i = 0; i < data.Length; ++i)
{
for (var j = 0; j < data[i].Length; ++j)
{
res[i,j] = data[i][j];
}
}
return res;
}
}
Sample Demo
I have a multi dimensional array which i need to convert to a list of arrays. Not one single array, but for each iteration of the first dimension i need a separate array containing the values in the second dimension.
How do I convert this:
int[,] dummyArray = new int[,] { {1,2,3}, {4,5,6}};
into a list<int[]> holding two arrays with values {1,2,3} and {4,5,6}?
You can convert 2d array into jagged array and then convert it to List.
int[,] arr = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int[][] jagged = new int[arr.GetLength(0)][];
for (int i = 0; i < arr.GetLength(0); i++)
{
jagged[i] = new int[arr.GetLength(1)];
for (int j = 0; j < arr.GetLength(1); j++)
{
jagged[i][j] = arr[i, j];
}
}
List<int[]> list = jagged.ToList();
You can use Linq:
int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int count = 0;
List<int[]> list = dummyArray.Cast<int>()
.GroupBy(x => count++ / dummyArray.GetLength(1))
.Select(g => g.ToArray())
.ToList();
You could use for loop like this:
int[,] dummyArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
int size1 = dummyArray.GetLength(1);
int size0 = dummyArray.GetLength(0);
List<int[]> list = new List<int[]>();
for (int i = 0; i < size0; i++)
{
List<int> newList = new List<int>();
for (int j = 0; j < size1; j++)
{
newList.Add(dummyArray[i, j]);
}
list.Add(newList.ToArray());
}
Here is a reusable implementation
public static class Utils
{
public static List<T[]> To1DArrayList<T>(this T[,] source)
{
if (source == null) throw new ArgumentNullException("source");
int rowCount = source.GetLength(0), colCount = source.GetLength(1);
var list = new List<T[]>(rowCount);
for (int row = 0; row < rowCount; row++)
{
var data = new T[colCount];
for (int col = 0; col < data.Length; col++)
data[col] = source[row, col];
list.Add(data);
}
return list;
}
}
and sample usage
var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
var result = source.To1DArrayList();
Some comments on other answers.
M.kazem Akhgary: If I need a list, I don't see why should I first create jagged array and convert it to a list instead of creating list directly.
Eser: I usually like his elegant Linq solutions, but this definitely is not one of them. If the idea is to use Linq (although I strongly believe it's not intended for that), the following would be much more appropriate:
var source = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
var result = Enumerable.Range(0, source.GetLength(0))
.Select(row => Enumerable.Range(0, source.GetLength(1))
.Select(col => source[row, col]).ToArray())
.ToList();
I got 'Index was outside the bounds of the array' on this line of code in C#, what's wrong?
for (int j = 0; j < ja[i].Length; j++)
The complete code below:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[][] ja = new int[3][];
ja[0] = new int[2] { 1, 2 };
ja[1] = new int[2] { 4,1 };
ja[2] = new int[3] { 1, 2, 1 };
for (int i = 0; i < ja.Length; i++)
{
Console.Write("Element{0}", i++);
for (int j = 0; j < ja[i].Length; j++)
{
Console.Write(ja[i][j] + "\t");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
I am new to all this.
Thank you
The problem is i++ in Console.Write("Element{0}", i++) above. because i is use again in ja[i].Length. it makes ja[3].Length in the last execution. because you only define ja count = 3, so it make the error that you mention above.
in the other hand the i++ is impacted to the i variable itself, it make the i value changed.
int[][] ja = new int[3][];
ja[0] = new int[2] { 1, 2 };
ja[1] = new int[2] { 4, 1 };
ja[2] = new int[3] { 1, 2, 1 };
for (int i = 0; i < ja.Length; i++)
{
Console.Write("Element{0}", i);
for (int j = 0; j < ja[i].Length; j++)
{
Console.Write(ja[i][j] + "\t");
}
Console.WriteLine();
}
Console.ReadKey();