Related
I am trying to do my homework but what I am trying does not work.
the assignment is to basically multiply 2 arrays of different sizes together( and put all three into a message box so if you could help me with as well that would be great)
the problem is that I am getting "overflow" amounts of values, there should only be 10 but I am getting like 28
the code I currently have is
double[] array1 = new Double[10] { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
double[] array2 = new Double[5] { 0, 1, 2, 3, 4 };
double[] array3 = new double[10];
int hold = 1;
int counter = 0;
foreach (int c in array1)
{
foreach(int k in array2)
{
if (counter <= k)
{
array3[c] = (array1[c] * array2[c]);//edit3: array2 was wirtten with c when copied th outcome different but still not rigth with k
}
else
{
array3[c] = (array1[c] * hold);
}
}
foreach (int j in array3)
{
Console.WriteLine(array3[c]);
}
}
the out come looks like
0
0
0
0
0
0
0
0
0
0
6
6
6
6
6
6
6
6
6
6
12
12
12
12
12
12
12
12
12
12
20
20
20
20
20
20
20
20
20
20
it should look like
0
2
6
12
20
6
7
8
9
10
I have check stackoverflow all ready, so please just help not link me to another question, or if you do put a comment with it saying what I need to look at.
edit: the array3 have j just gives ten 0
edit2: the debugger is telling me what I already know I am making too many
values, the question is how to fix this, and only make 10 values
There are so many mistakes in your code. You need only one loop:
double[] array1 = new Double[10] { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
double[] array2 = new Double[5] { 0, 1, 2, 3, 4 };
double[] array3 = new double[10];
int hold = 1;
int counter = 0;
for (int i = 0; i < array1.Length; i++)
{
if (i < array2.Length)
{
array3[i] = array1[i] * array2[i];
}
else
{
array3[i] = (array1[i] * hold);
}
}
foreach (int j in array3)
{
Console.WriteLine(j);
}
Since you have to write something that can do a multiplication of two arrays with (possible) different lengths, you could start with determining the longest array from the shortest one, and then iterate the shortest and concatenate the leftover to the resulting array (since that stays 1 in your example), you could do this for example through:
static IEnumerable<double> Multiply( double[] left, double[] right ) {
if ( left == null ) {
throw new ArgumentNullException( nameof(left));
}
if ( right == null ){
throw new ArgumentNullException( nameof(right));
}
var largest = left.Length > right.Length ? left : right;
var smallest = left.Length > right.Length ? right : left;
return smallest.Select( ( value, idx ) => value * largest[idx] )
.Concat( largest.Skip( largest.Length - smallest.Length ) );
}
This would give you an IEnumerable<double> result back as part of the function, and you could then use it in this way:
public static void Main( string[] args ) {
var array1 = new double[10] { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var array2 = new double[5] { 0, 1, 2, 3, 4 };
var multiplication = Multiply( array1, array2 );
foreach ( var item in multiplication ) {
Console.WriteLine( item );
}
Console.ReadLine();
}
Now, when looking into your original code, lets check some parts that where problematic in your version
double[] array3 = new double[10];
Declaring the array3 to a fixed size makes your code quite vulnerable, namely if array2 or array1 changes in length, the result size would also change? In my example, in is more dynamic, as it depends on the largest array of the two.
int counter = 0;
// ...
if (counter <= k)
you define a counter to be null, but it is never incremented in the shared code, because of that your code should have crashed when hitting array2[c] where c has a value larger than the largest index in array2, which kinda explains why it only goes till 20
foreach (int c in array1)
{
foreach(int k in array2)
foreach will set the variable c and k respectively to the next value of array1 and array2 upon each iteration, but in your code you are using it more as an indexer, so you should have used the. Furthermore, you are iterating a double[] and define the variable as int, that could give very confusing results, so you would have been easier of using
for (var c = 0; c < array1.Length; c++)
{
for (var k = 0; k < array2.Length; k++)
{
And now you can use them as indexes.
And the last one is that you where looping array3 using foreach inside the first foreach loop (thus repeating your iteration), while using c as an index for your array while it should have been j variable.
Now if you fix all these points you get something like Melchia's answer, but that is also a fragile one, for example, if you would switch array1 and array2 your code won't give the expected output anymore
This question might be something really simple and I might be missing something really basic, but how do you interpolate a 1D array in C#?
Lets say I have this array of n elements
int[] array1 = new int[] { 1, 3, 5, 7, 1 };
How to stretch or compress the array so that it has n values and interpolates the values, just like when you resize an image, thats it, not chopping or adding zeros or empty values to the array.
For example if I want to convert the array so it has n = 4 elements, get this
array1
>>[2, 4, 6, 4]
what I'm trying to do is the same as the resample function from matlab does
https://mathworks.com/help/signal/ref/resample.html
I suggest this solution for the case that the new array is shorter than the old one:
int[] array1 = new int[] { 1, 3, 5, 7, 9 };
int[] array2 = new int[4];
for (var i = 0; i < array2.Length; i++)
{
var doubleIndex1 = (double)i * array1.Length / array2.Length;
var index1 = (int)Math.Floor(doubleIndex1);
var rel = doubleIndex1 - index1;
array2[i] = (int)Math.Round((1.0 - rel) * array1[index1] + rel * array1[index1 + 1]);
}
im trying to multiply each element in three different arrays by 2 with a loop but im having trouble. im really new at this so please excuse any obvious mistakes lol im not even sure ive im using the right kind of loop but heres what i have so far:
int[] firstArray = new int[] { 1, 2, 5, 6, 9 };
int[] secondArray = new int[] { 12, 3, 8, 20, 7 };
int[] thirdArray = new int[] { 2, 4, 6, 8, 10, 12 };
foreach(new int [5] in firstArray)
{
int newArray1= firstArray.Length * 2;
Console.WriteLine(newArray1);
}
i want it to print out the first new array as "2, 4, 10, 12, 18" in the console but when i run it, i get the error type and identifier are both required in a foreach statement.
any help would be greatly appreciated!
Do this with Linq
int[] resultFirstArray = firstArray.Select(r=> r * 2).ToArray();
int[] resultSecondArray = secondArray.Select(r=> r * 2).ToArray();
int[] resultThirdArray = thirdArray.Select(r=> r * 2).ToArray();
Or you can use Array.ConvertAll
Array.ConvertAll converts an entire array. It converts all elements in one array to another type.
var resultFirstArray = Array.ConvertAll(firstArray, x => 2 * x);
var resultSecondArray = Array.ConvertAll(secondArray, x => 2 * x);
var resultThirdArray = Array.ConvertAll(thirdArray, x => 2 * x);
If you just want to show the doubled values:
foreach(int value in firstArray)
{
Console.WriteLine(2 * value);
}
If you want to double the values in the array, then:
for(int i = 0 ; i < firstArray.Length ; i++)
{
firstArray[i] *= 2;
}
Then perhaps to show those values:
foreach(int value in firstArray)
{
Console.WriteLine(value);
}
If you want to create a new array with the values doubled:
var doubledArray = Array.ConvertAll(firstArray, x => 2 * x);
And to output those values:
foreach(int value in doubledArray)
{
Console.WriteLine(value);
}
I build my MyObject array with :
MyObject[] myObject = (from MyObject varObj in MyObjects
select varObj).ToArray();
and now, I'd like to extract 3 random MyObject from this array! How can I do it on C#?
Of course, if array lenght is <3 I need to extract all objects!
You can do this via Linq:
Retrieve the items in random order (see Jon Skeet's answer to this SO question)
Select Top(3) of the resulting list using the Take operator
As an example, select 3 processes at random:
var ps = (from p in Process.GetProcesses() orderby Guid.NewGuid() select p).Take(3);
You can also use random.Next() instead of Guids (since strictly speaking, as pointed out by LukeH, Guids are unique, but not random).
MyObject[] myObject = ...;
int upper = 1;
if (myObject.Length > 1)
{
Random r = new Random();
upper = Math.Min(3, myObject.Length);
for (int i = 0; i < upper; i++)
{
int randInd = r.Next(i, myObject.Length);
MyObject temp = myObject[i];
myObject[i] = myObject[randInd];
myObject[randInd] = temp;
}
}
now take elements of the array from 0 to upper.
using Random class of C# you can get random int which are less than a particular number which in your case will be the size of myObject
I am not sure you want unique or they can duplicate.
How about?
Random r = new Random();
int item1 = r.Next(0, myObject.Length);
int item2 = r.Next(0, myObject.Length);
int item3 = r.Next(0, myObject.Length);
var result1 = myObject[item1];
var result2 = myObject[item2];
var result3 = myObject[item3];
No Linq or anything, but it gets the job done.
What about this:
var random = new Random();
var objs = new Object[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var result = objs.OrderBy(o => random.Next(Int32.MaxValue)).Take(3);
A little bit more creative.
var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 1, 2, 3, 44, 5, 6 };
Random random = new Random();
var results = list.OrderBy(i => random.Next()).Take(3);
Output:
results: {int[3]}
[0]: 3
[1]: 2
[2]: 5
Lets say I have this array,
int[] numbers = {1, 3, 4, 9, 2};
How can I delete an element by "name"? , lets say number 4?
Even ArrayList didn't help to delete?
string strNumbers = " 1, 3, 4, 9, 2";
ArrayList numbers = new ArrayList(strNumbers.Split(new char[] { ',' }));
numbers.RemoveAt(numbers.IndexOf(4));
foreach (var n in numbers)
{
Response.Write(n);
}
If you want to remove all instances of 4 without needing to know the index:
LINQ: (.NET Framework 3.5)
int[] numbers = { 1, 3, 4, 9, 2 };
int numToRemove = 4;
numbers = numbers.Where(val => val != numToRemove).ToArray();
Non-LINQ: (.NET Framework 2.0)
static bool isNotFour(int n)
{
return n != 4;
}
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = Array.FindAll(numbers, isNotFour).ToArray();
If you want to remove just the first instance:
LINQ: (.NET Framework 3.5)
int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIndex = Array.IndexOf(numbers, numToRemove);
numbers = numbers.Where((val, idx) => idx != numIndex).ToArray();
Non-LINQ: (.NET Framework 2.0)
int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIdx = Array.IndexOf(numbers, numToRemove);
List<int> tmp = new List<int>(numbers);
tmp.RemoveAt(numIdx);
numbers = tmp.ToArray();
Edit: Just in case you hadn't already figured it out, as Malfist pointed out, you need to be targetting the .NET Framework 3.5 in order for the LINQ code examples to work. If you're targetting 2.0 you need to reference the Non-LINQ examples.
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();
You can also convert your array to a list and call remove on the list. You can then convert back to your array.
int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);
The code that is written in the question has a bug in it
Your arraylist contains strings of " 1" " 3" " 4" " 9" and " 2" (note the spaces)
So IndexOf(4) will find nothing because 4 is an int, and even "tostring" would convert it to of "4" and not " 4", and nothing will get removed.
An arraylist is the correct way to go to do what you want.
I posted my solution here.
This is a way to delete an array element without copying to another array - just in frame of the same array instance:
public static void RemoveAt<T>(ref T[] arr, int index)
{
for (int a = index; a < arr.Length - 1; a++)
{
// moving elements downwards, to fill the gap at [index]
arr[a] = arr[a + 1];
}
// finally, let's decrement Array's size by one
Array.Resize(ref arr, arr.Length - 1);
}
Removing from an array itself is not simple, as you then have to deal with resizing. This is one of the great advantages of using something like a List<int> instead. It provides Remove/RemoveAt in 2.0, and lots of LINQ extensions for 3.0.
If you can, refactor to use a List<> or similar.
Balabaster's answer is correct if you want to remove all instances of the element. If you want to remove only the first one, you would do something like this:
int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int firstFoundIndex = Array.IndexOf(numbers, numToRemove);
if (numbers >= 0)
{
numbers = numbers.Take(firstFoundIndex).Concat(numbers.Skip(firstFoundIndex + 1)).ToArray();
}
As a generic extension, 2.0-compatible:
using System.Collections.Generic;
public static class Extensions {
//=========================================================================
// Removes all instances of [itemToRemove] from array [original]
// Returns the new array, without modifying [original] directly
// .Net2.0-compatible
public static T[] RemoveFromArray<T> (this T[] original, T itemToRemove) {
int numIdx = System.Array.IndexOf(original, itemToRemove);
if (numIdx == -1) return original;
List<T> tmp = new List<T>(original);
tmp.RemoveAt(numIdx);
return tmp.ToArray();
}
}
Usage:
int[] numbers = {1, 3, 4, 9, 2};
numbers = numbers.RemoveFromArray(4);
You can do in this way:
int[] numbers= {1,3,4,9,2};
List<int> lst_numbers = new List<int>(numbers);
int required_number = 4;
int i = 0;
foreach (int number in lst_numbers)
{
if(number == required_number)
{
break;
}
i++;
}
lst_numbers.RemoveAt(i);
numbers = lst_numbers.ToArray();
' To remove items from string based on Dictionary key values.
' VB.net code
Dim stringArr As String() = "file1,file2,file3,file4,file5,file6".Split(","c)
Dim test As Dictionary(Of String, String) = New Dictionary(Of String, String)
test.Add("file3", "description")
test.Add("file5", "description")
stringArr = stringArr.Except(test.Keys).ToArray()
public int[] DeletePart(int position, params int[] numbers)
{
int[] result = new int[numbers.Length - 1];
int z=0;
for (int i = 0; i < numbers.Length; i++)
{
if (position - 1 != i)
{
result[z] = numbers[i];
z++;
}
}
return result;
}
We can delete array elements by using for loops and continue statements:
string[] cars = {"volvo", "benz", "ford", "bmw"};
for (int i = 0; i < cars.Length; i++)
{
if (cars[i] == "benz")
{
continue;
}
Console.WriteLine(cars[i]);
}