2016-07-05 1 views
1

Я пытаюсь удалить элемент из List<string[]>, но удалить свойство не работает, но если я использую RemoveAt(0) (любое значение с жестким кодом), то он работает ... Что может быть проблемой. Может кто-нибудь мне помочь?Удалить элемент из списка <string[]> или получить индекс любого элемента в любой позиции

Вот мой код ...

List<string[]> ipcol1 = new List<string[]>(); 
ipcol1.Add(new string[] { "test1" }); 
ipcol1.Add(new string[] { "test2" }); 
ipcol1.Add(new string[] { "test3" }); 
ipcol1.Add(new string[] { "test4" }); 
ipcol1.Remove(new string[] { "test1" }); 

int i = ipcol1.IndexOf(new string[] { "test4" }); 
ipcol1.RemoveAt(i); 

Или, если я пытаюсь взять индекс perticular пункта, то это дает мне (-1), как результат ... Если я могу получить индекс этой проблемы то моя проблема может решить ... Пожалуйста, помогите мне.

+0

Строковый массив, который вы добавляете в список, не совпадает с тем, который вы используете в 'IndexOf'. Они могут иметь одно и то же значение, но они не являются одним и тем же экземпляром. Поскольку массивы являются * ссылочными * типами, ни один из ваших предметов не будет таким же. –

ответ

6

Вы должны использовать SequenceEqual при сравнении массивов:

List<string[]> ipcol1 = new List<string[]>(); 
    ipcol1.Add(new string[] { "test1" }); 
    ipcol1.Add(new string[] { "test2" }); 
    ipcol1.Add(new string[] { "test3" }); 
    ipcol1.Add(new string[] { "test4" }); 

    ipcol1.RemoveAll(array => array.SequenceEqual(new string[] { "test1" })); 

или (в случае, если вы хотите, чтобы удалить запись, которая содержит "test1" где-то в массиве):

ipcol1.RemoveAll(array => array.Any(item => item == "test1"))); 

Причина заключается в том, что два массивы равны, если они имеют значение .:

string[] array1 = new string[0]; 
    string[] array2 = array1; 
    string[] array3 = new string[0]; 

    // "Yes" - array1 and array2 reference to the instance 
    Console.WriteLine((array1 == array2) ? "Yes" : "No"); 
    // "No" - array1 and array3 are references to different instances 
    Console.WriteLine((array1 == array3) ? "Yes" : "No"); 

    // "Yes" - array1 and array3 are equal sequences 
    Console.WriteLine((array1.SequenceEqual(array3)) ? "Yes" : "No"); 
0

Массивы являются ссылочными типами. Недопустимый код ниже, потому что вы сравниваете ссылки двух отдельных экземпляров.

ipcol1.Remove(new string[] { "test1" }); 

Для сравнения коллекций вы можете использовать SequenceEqual.