2016-07-05 26 views
1

我想从List<string[]>删除项目,但删除属性不起作用,但如果我使用RemoveAt(0)(任何int硬编码的值),那么它的工作......什么可以成为问题。谁能帮我?从列表中删除项目<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

数组是引用类型。下面的代码失败,因为您正在比较两个单独实例的引用。可以使用SequenceEqual来比较收藏。

相关问题