I'm trying to arrange a 2D array in ascending order. This code runs for a 1D array but i'm struggling to implement it for 2D so that it places each row of the array in ascending order.
1D
public static void Main(string[] args)
{
int[] sam = { 4, 7, 2, 0 };
Array.Sort(sam);
foreach (int value in sam)
{
Console.Write(value);
Console.Write(' ');
}
Console.WriteLine();
}
2D
public static void Main(string[] args)
{
int[] sam = { 4, 7, 2, 0 }, {4, 6, 2, 0};
Array.Sort(sam);
foreach (int value in sam)
{
Console.Write(value);
Console.Write(' ');
}
Console.WriteLine();
}
You can do something like this:
static void Main(string[] args) {
int[][] sam = new int[2][];
sam[0] = new int[] {4, 6, 2, 0};
sam[1] = new int[] {4, 7, 2, 0};
foreach(var array in sam)
{
Array.Sort(array);
foreach(var item in array)
Console.Write(item+" ");
Console.WriteLine();
}
}
Here, we are declaring a 2D array and then initializing each array one at a time. Then, we are looping through the sam array and then sorting each 1D array within it.
There are multiple solutions, one solution I'm thinking is using Array of Arrays (Jagged Array).
Let's say, if you have jagged array as defined below
int[][] numbers2 = new int[][] {
new int[]{4,5,6},
new int[]{1,2,3},
new int[]{7,8,9}
...
};
You can get sorted Jagged array using
int[][] sorted = numbers2.Select(x=> string.Join("-", x.ToArray()))
.OrderBy(x=>x)
.Select(x=> x.Split('-').Select(int.Parse).ToArray())
.ToArray();
Another option, let's your input is a 2d array you could do more or less same but output is sorted Jagged array.
int[][] sorted_array = numbers.Cast<int>()
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / (numbers.GetUpperBound(0) +1))
.Select(x => string.Join("-", x.Select(v => v.Value)) )
.OrderBy(x=>x)
.Select(x=> x.Split('-').Select(int.Parse).ToArray())
.ToArray();
These are just my options, you will be the best to choose which is right to your solution.
Check this Example
Related
I have array1 like this
int[][] array1 = int[][] { int[]{0,7}, int[]{0,1}, int[]{0,6}, int[]{0,5}, int[]{1,7} }
and I have array2 like this:
int[][] array2 = int[][] { int[]{0,7}, int[]{0,5} }
How can I get index of element in array1 from elements in array2?
For instance:
int[] { 0, 7 } is id of 0 because it is first element
int[] { 0, 5 } - id - 3 because it is fourth element in array1.
And int[] { 0, 5 } and int[] { 5, 0 } are the same members.
Should I simply loop array1 and check members inside? Or there is smarter way of searching coincident items in array1?
You can do this if you want to get every id in array1.
You'll need to add a using System.Linq;
List<int> ids = new List<int>();
foreach (int[] arr in array2)
{
var ordered = arr.OrderBy(x => x);
ids.Add(Array.FindIndex(array1, a => a.OrderBy(x => x).SequenceEqual(ordered)));
}
Note that ids will contain -1 where arr is not found in array1.
The arrays are being sorted before checking them for being equal, as you mentioned that [5, 0] is the same member as [0, 5].
I have a List of int arrays. The list can be from 1 to 4 arrays.
I want to know how do i go about summing each array with individual threads and
placing the summed values into a new int array.
If the order of the new array is not important here you have a example
List<int[]> arraysList = new List<int[]>();
arraysList.Add(new int[] { 2, 3, 5 });
arraysList.Add(new int[] { 2, 3, 5, 9, 123, 5 });
arraysList.Add(new int[] { 3 });
arraysList.Add(new int[] { 9,8 });
ConcurrentBag<int> SummedValueOfEveryArray = new ConcurrentBag<int>();
Parallel.ForEach(arraysList, array =>
{
SummedValueOfEveryArray.Add(array.Sum());
});
//Your result
var result = SummedValueOfEveryArray.ToArray<int>();
//The sum of all arrays
var totalSum = SummedValueOfEveryArray.Sum();
This code will do what you ask. One side note however, this only parallelizes when .Net feels it could improve performance.
List<int[]> intlist = new List<int[]>();
int[] result = intlist.AsParallel().Select(arr => arr.Sum()).ToArray();
Given 1 to 4 arrays it may be that .Net never sees the point of parallelizing. But if you absolutely must you can force parallelization by using Parallel.For as shown below.
List<int[]> intlist = new List<int[]>();
int[] result = new int[intlist.Count];
Parallel.For(0, intlist.Count, i =>
{
result[i] = intlist[i].Sum();
});
If you had a List of arrays like:
List<int[]> ListOfArrays = new List<int[]>();
ListOfArrays.Add(new int[] { 1, 1 });
ListOfArrays.Add(new int[] { 2, 1 });
How would you find the index of { 2, 1} in the List?
I do not want to use an iteration loop. I would like a concise method like the one suggested by PaRiMaL RaJ in Check if string array exists in list of string:
list.Select(ar2 => arr.All(ar2.Contains)).FirstOrDefault();
(the above code will return true if members of a given string array exist in a list of string arrays)
var myArr = new int[] { 2, 1 };
List<int[]> ListOfArrays = new List<int[]>();
ListOfArrays.Add(new int[] { 1, 1 });
ListOfArrays.Add(new int[] { 4, 1 });
ListOfArrays.Add(new int[] { 1, 1 });
ListOfArrays.Add(new int[] { 2, 1 });
int index = ListOfArrays.FindIndex(l => Enumerable.SequenceEqual(myArr, l));
You can use the SequenceEqual method for this. See MSDN: https://msdn.microsoft.com/en-us/library/vstudio/bb348567(v=vs.100).aspx
You can try this:
List<int[]> ListOfArrays = new List<int[]>();
ListOfArrays.Add(new int[] { 1, 1 });
ListOfArrays.Add(new int[] { 2, 1 });
var chk = ListOfArrays.FindIndex(e => (e.SequenceEqual(new int[] { 2, 1 })));
I have 2D array in c#, like this:
int[][] 2darray = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
how can I get one column as normal array, like
int[] array = 2darray[1][]; //example, not working
and have
int[] array = {3,4};
?
Thanks.
There are several reasons why your code can't compile
This way it works:
int[][] array2d = { new[]{ 1, 2 }, new[]{ 3, 4 }, new[]{ 5, 6 }, new[]{ 7, 8 } };
int[] array = array2d[0];
Problems:
2darray is not a valid variable name
The indexing is wrong
The initialization of the original array is wrong
EDIT:
As stated by #heltonbiker, if you require all elements of the first column, you can use this:
int[] col = array2d.Select(row => row[0]).ToArray();
For an array with two columns and four rows, you can use LINQ this way:
using System.Linq;
first_column = _2darray.Select(row => row[0]).ToArray();
Note that changing the first or second array will not change the other one.
You are confusing jagged arrays and multidimensional arrays in C#. While they are similar, there is a slight difference. Rows in a jagged array can have a different number of elements, while in a 2D-array they are of the same length. Therefore when working with jagged arrays you need to remember to write handling for a missing column element. I composed a sample console app below to show how both of them work - it uses 0 as a substitute for a missing element, but you can throw an error etc.:
using System.Collections.Generic;
namespace JaggedArrayExample
{
class Program
{
static void Main(string[] args)
{
//jagged array declaration
int[][] array1;
//jagged array declaration and assignment
var array2 = new int[][] {
new int[] { 1, 2 },
new int[] { 3, 4 },
new int[] { 5, 6 },
new int[] { 7, 8 }
};
//2D-array declaration
int[,] array3;
//2D-array declaration and assignment (implicit bounds)
var array4 = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
//2D-array declaration and assignment (explicit bounds)
var array5 = new int[4, 2] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
//get rows and columns at index
var r = GetRow(array2, 1); //second row {3,4}
var c = GetColumn(array2, 1); //second column {2,4,6,8}
}
private static int[] GetRow(int[][] array, int index)
{
return array[index]; //retrieving the row is simple
}
private static int[] GetColumn(int[][] array, int index)
{
//but things get more interesting with columns
//especially if jagged arrays are involved
var retValue = new List<int>();
foreach (int[] r in array)
{
int ub = r.GetUpperBound(0);
if (ub >= index) //index within bounds
{
retValue.Add(r[index]);
}
else //index outside of bounds
{
retValue.Add(0); //default value?
//or you can throw an error
}
}
return retValue.ToArray();
}
}
}
try this, it should work
int[] array = array2d[1];
Change the name of the variable to array2d, you cannot have variable that starts with number, a variable can start with letter or underscore.
How do I sort a List<int> {1,4,2,56,7} from smallest to largest and largest to smallest? I have tried a few things, like
List<int> sorted = Listname.Sort();
and
List<int> sorted = Listname.OrderByDescending();
but I don't understand the syntax completely.
You can use LINQ:
var smallToLarge = Listname.OrderBy(x => x);
var largeToSmall = Listname.OrderByDescending(x => x);
If you want to assign them to a list, like in the code sample in your question, you'll have to call .ToList() after each one.
class Program
{
static void Main(string[] args)
{
List<int> listOfInts = new List<int>() { 1, 4, 2, 56, 7 };
listOfInts.Sort();
foreach (int ii in listOfInts)
{
Console.WriteLine("{0}", ii);
}
Console.WriteLine("Descending ...");
listOfInts.Reverse();
foreach (int ii in listOfInts)
{
Console.WriteLine("{0}", ii);
}
Console.WriteLine("Hit any key to continue");
Console.ReadKey();
}
}
To sort by ascending and descending
List<int> ints = new List<int>() { 1, 4, 2, 56, 7 };
ints.Sort(); // by asc
ints.Reverse(); //by desc