Add array to an array - one by one - c#

I would like to add arrays to a list or multidimensional array (not all at once...). But I dont really understand why this should be that hard.
Lets say I have this:
string[] a = { "h", "b"};
string[] b = { "c", "a", "i" };
string[] c = { "out", "in", "file", "test" };
ArrayList x = null;
x.Add(a); //error: Object reference not set to an instance of an object.
x.Add(b);
x.Add(c);
Can I use instead of the ArrayList maybe
string[,] x = null;
But there is no option to .Add
Lets say I have an unknown amount of string[]´s with an unknown size - how do I add them to a List/multidimensional array? And again: I would like to add these string[]´s one by one. Any ideas?

You are getting an NullReferenceException because your list is not initialized:
string[] a = { "h", "b"};
string[] b = { "c", "a", "i" };
string[] c = { "out", "in", "file", "test" };
IList<string[]> x = new List<string[]>;
x.Add(a);
x.Add(b);
x.Add(c);
This assumes that you are constructing a 2-D structure. If you would like to "flatten" your arrays into a single list of strings, create a list, and use its List.AddRange method instead.

you haven't made an instance of the ArrayList you want to store the string arrays in. Try adding
ArrayList x = new ArrayList();
x.Add(a);
...
...

ArrayList x = null;
x.Add(a);
That would work if:
You create an instance of ArrayList:
ArrayList x = new ArrayList();
all you were doing was to declare a local variable.
You are careful to separate ArrayList.Add from ArrayList.AddRange. The former adds a single object. In your case the first element (after the first Add) would be itself an array. To access the "h" would need x[0][0]. AddRange takes each passed collection element in term and adds it to the collection. Thus getting the "h" would be x[0] and "b" would be x[1].
I think you want:
string[] a = { "h", "b"};
string[] b = { "c", "a", "i" };
string[] c = { "out", "in", "file", "test" };
ArrayList x = new ArrayList();
x.AddRange(a);
x.AddRange(b);
x.AddRange(c);

The keyword null essentially means "no object". Therefore when you write x.Add(a) you are trying to call the Add method on something that isn't there.
You need to initialize your list first, which puts something in the box labelled x:
ArrayList x = new ArrayList();
You can now call x.add(a) and your code will work as expected.

You are missing new for ArrayList so you should do it like this:
ArrayList x = new ArrayList();
x.AddRange(a);
x.AddRange(b);
x.AddRange(c);
You can't can't use array in Add method , you will not get any compile error but then while you will access the object you will get just ToString on type that means if you say:
string[] a = { "h", "b"};
x.Add(a);
and then try to loop through the elements like:
foreach (var item in x)
{
Console.WriteLine(item);
}
you will the result: System.String[] and I hope you don't want that, so you need to use AddRange method which takes an argument of type ICollection, so you say:
x.AddRange(a);
and if you do a loop on array list like:
foreach (var item in x)
{
Console.WriteLine(item);
}
you will get the output,
h
b

One way to do it is:
List<List<string>> list = new List<List<string>>();
list.Add(new List<string>(){
"str1", "str2", "..."
});
be sure to include: using System.Collections.Generic;

Related

Assert that a collection does not contain any item in another collection

Consider this code:
string[] myCollection = { "a", "b", "c", "d" };
string[] anotherCollection = { "c", "d" };
I want to test that myCollection does not contain any item of anotherCollection. How can I achieve that in NUnit?
I tried these:
CollectionAssert.DoesNotContain(anotherCollection, myCollection);
Assert.That(myCollection, Has.No.Member(anotherCollection));
...but the problem is that these functions operate on a single entity and I did not find any way to let them work with arrays.
To assert that a collection does not contain any of a set of items, we can check that the intersection of another collection is empty using LINQ:
string[] subject = { "a", "b", "c", "d" };
string[] forbidden = { "c", "d" };
Assert.IsEmpty(subject.Intersect(forbidden));
// Or:
Assert.That(subject.Intersect(forbidden), Is.Empty);
The test shown above will fail because both collections contain the values "c" and "d".
If we want the test to fail only when the collection contains all of the prohibited items:
Assert.That(subject.Intersect(forbidden), Is.Not.EquivalentTo(forbidden));
// Or:
Assert.That(subject, Is.Not.SupersetOf(forbidden));

C# list of array type

I want to create a list of array type.
I want to create array containing values :
array = [a,b];
Then i want to put this array in list :
List<Array> list = new List<Array>( );
I am able to do this with list of string type but no luck with array type :
List<String> list = new List<String>( );
I am from javascript background, not much familiar with concept of collections in c#.
Also how can i create array in c# like we do in javascript :
var arrTemp = ["a", "b"];
Well, since your array is string[]:
var arrTemp = ["a", "b"];
you have to declare the required list as List<string[]>:
// list of string arrays
List<string[]> list = new List<string[]>() {
new string[] {"a", "b"}
};
In case you want to be able to put any array into the list declare it as loose as possible (List<object[]>):
// list of abitrary arrays
List<object[]> list = new List<object[]>() {
new string[] {"a", "b"},
new double[] {123.45, 789.12, 333.55},
new object[] {'a', "bcd", 1, 244.95, true},
};
Hope this can help you
var test = new List<int[]>();
You can actually create a list of arrays:
var listOfArrays = new List<Array>();
The problem with this is that it's difficult to use the arrays themselves, as the Array type doesn't support array syntax. (e.g. You can't do listOfArrays[0][0]) Instead, you have to use the GetValue method to do your retrieval:
var obj = listOfArrays[0].GetValue(0);
But this has another problem. The GetValue method returns object, so while you could always cast it to the desired type, you lose your type safety in choosing this approach.
Alternatively, you could just store object[] arrays:
var listOfArrays = new List<object[]>();
var obj = listOfArrays[0][0];
But while this solves the issue of the array notation, you still lose the type safety.
Instead, if at all possible, I would recommend finding a particular type, then just have arrays of that type:
var listOfArrays = new List<string[]>();
string s = listOfArrays[0][0];
for example, an array of strings would be
var arrayOfString = new string[]{"a","b"};
// or shorter form: string[] arrayOfString = {"a","b"};
// also: var arrayOfString = new[] { "a", "b" }
And then creating a list-of-arrayOfString would be
var listOfArrayOfString = new List<string[]>();
This works with any type, for example if you had a class MyClass
var arrayOfMyClass = new MyClass[]{ ... }; // ... is you creating instances of MyClass
var list = new List<MyClass[]>();

eliminating duplicated lists from a nested list c#

i have a nested list that contains a set of lists, some of these lists are duplicated, i wanna just make a second list without duplicated lists. i tried this :
List<List<string>> liste1 = new List<List<string>>();
List<List<string>> liste2 = new List<List<string>>();
List<string> l1 = new List<string> { "a", "b", "c" };
List<string> l2 = new List<string> { "h", "x", "g" };
List<string> l3 = new List<string> { "a", "b", "c" };
List<string> l4 = new List<string> { "z", "t", "n" };
liste1.Add(l1);
liste1.Add(l2);
liste1.Add(l3);
liste1.Add(l4);
foreach (List<string> lis in liste1)
{
if(!liste2.Contains(lis))
{
liste2.Add(lis);
}
}
it seems easy but its not working, any help will be appreciated. Thx.
Using Linq, you could achieve this.
You could take help of extension methods and look for SequentialEqual of two lists. If the order is not important use Except extension (something like ...s.Except(x).Any()).
var liste2= liste1.Where((x,i)=> !liste1.Skip(i+1).Any(s=>s.SequenceEqual(x)));
Check this Demo
You are checking for reference equality. Instead of using Contains try this substitution
//if (!liste2.Contains(lis))
if(!liste2.Any(subList => subList.SequenceEqual(lis)))
SequenceEqual is an extension method on IEnumerable<T>. I think you will need a using statement importing the System.Linq namespace.
If you dont want to test that the child lists are not sequence-equal, but set-equal (i.e. order is not important), then consider using an implementation of ISet<T> like HashSet<int> instead of List<int>.

Remove From List X all content of List Y

I have two list my requirement is I want to create one list whose data should be all value of x minus all value from y.
For example.
List<string> s = new List<string>();
List<string> y = new List<string>();
List s contain {“a”,”b”,”c”,”d”}
List y contain {“b”,”c”}
I want one to create one more list
List<string> z = new List<string>();
Whose value should be
{“a”,”d”}
Just use LinQ:
z=s.Except(y).ToList();
Here's a reference for your specific problem: How to: Find the Set Difference Between Two Lists (LINQ)
One approach it would be the following
z=s.Where(x=>!y.Contains(x)).ToList();
this should do it
List<string> a = new List<string> { "a", "b", "c", "d" };
List<string> b = new List<string> { "b", "c" };
List<string> c = a.Except(b, StringComparer.OrdinalIgnoreCase).ToList();

Retrieve and Remove elements from string

Say I have a list of string
List<string> lst=new List<string>(new string[]{"a","b","c","d"});
I wish to get element from index 0 to index 2 assign it to another List lst1(i.e. the element of lst is {"a","b"}), then remove it from lst (i.e. lst becomes {"c","d"}, what's the quickest way of doing this? I am thinking is there any command like
List<string> lst=new List<string>();
lst1=lst.getElements(1,2);
lst.remove(1,2);
Use GetRange() to copy of a range of elements and RemoveRange() to removes a range of elements.
Example :
List<string> lst = new List<string>(new string[] { "a", "b", "c", "d" });
List<string> lst1 = lst.GetRange(0, 2);
lst.RemoveRange(0, 2);
Good Luck !!
You can use AddRange and RemoveRange:
var range = lst.Take(2);
lst1.AddRange(range);
lst.RemoveRange(0, 2);
Demo: http://ideone.com/1X2cV

Categories