2015-12-08 86 views
2

我在C#中嵌套列表有點麻煩。獲取嵌套列表中的值索引

List<List<string>> nestedList = new List<List<string>>(); 
nestedList.Add(new List<string> { "test1" }); 
nestedList.Add(new List<string> { "test2" }); 
nestedList.Add(new List<string> { "test3" }); 

所以,如果我是正確的nestedList目前已在其3個不同的列表,每一個值。

我試圖做的是

if (nestedList[0[0]]) == "test1") 

(如果第一個列表的第一個值等於"test1"

我能做些什麼,以找出是否列表的特定指數包含"test1"

+0

這裏有個提示:'列表 firstNestedList = nestedList [0];' - 你如何訪問列表的第一項? – cubrr

+4

你不應該像'nestedList [0 [0]]一樣訪問''。你應該這樣做'nestedList [0] [0]' –

回答

0

這樣做:

nestedList[0][0] 

第二[0]訪問嵌套列表的索引。由於list[0]給出列表的第一個元素,因此列表[0] [0]給出列表的第一個元素的第一個元素。

1

你的猜測幾乎是正確的。你想使用什麼是nestedList[0][0]

List<List<string>> nestedList = new List<List<string>>(); 
nestedList.Add(new List<string> { "test1" }); 
nestedList.Add(new List<string> { "test2" }); 
nestedList.Add(new List<string> { "test3" }); 

if (nestedList[0][0] == "test1") 
{ 
    Console.WriteLine("Test 1!"); 
} 

如果它可以幫助你理解語法,這裏是一個等價的代碼:

List<List<string>> nestedList = new List<List<string>>(); 
nestedList.Add(new List<string> { "test1" }); 
nestedList.Add(new List<string> { "test2" }); 
nestedList.Add(new List<string> { "test3" }); 

List<string> firstList = nestedList[0]; // Here's your new List<string> { "test1" } 
if (firstList[0] == "test1") 
{ 
    Console.WriteLine("Test 1!"); 
} 

然而,你要訪問子的時候要小心像這樣的列表,如果你不完全確定所有的列表已經填充。例如,下面的例子將迎接您的ArgumentOutOfRangeException其原因在於List<string>內沒有物品通過nestedList[0]返回:

List<List<string>> nestedList = new List<List<string>>(); 
nestedList.Add(new List<string>()); 
nestedList.Add(new List<string>()); 
nestedList.Add(new List<string>()); 

if (nestedList[0][0] == "test1") // Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index 
{ 
    Console.WriteLine("Test 1!"); 
} 

您可以確保,例如,首先檢查父列表項數:

if (nestedList[0].Count> 0 && nestedList[0][0] == "test1") 
{ 
    Console.WriteLine("Test 1!"); 
} 

如果您要訪問的實現IEnumerable<T>接口什麼的第一個元素的安全方式(基本上在框架每集合類),你可以使用LINQ(添加using System.Linq;FirstOrDefault方法:

if (nestedList[0].FirstOrDefault() == "test1") 
{ 
    Console.WriteLine("Test 1!"); 
} 

當枚舉的元素是class ES,則該方法返回任一可枚舉或null的第一個元素。

0

您可以使用LINQ查詢嵌套列表以獲得該項目,如果你得到它,使用IndexOf方法來獲取指數

List<List<string>> nestedList = new List<List<string>>(); 
nestedList.Add(new List<string> { "test1" }); 
nestedList.Add(new List<string> { "test2" }); 
nestedList.Add(new List<string> { "test3" }); 

var tocheck="test3"; 

var item = nestedList.Where(s=>s.Any(d=>d==tocheck)).FirstOrDefault(); 
if(item!=null) 
{ 
    var itemIndex=nestedList.IndexOf(item); 
    // Console.WriteLine(itemIndex); 
} 

Here是一個工作的dotnet小提琴。

0

如果你只是需要訪問特定的指數,那麼你的方法是:

nestedList[0][0]; //("test1") 
nestedList[1][0]; //("test2") ... 

但是,如果你需要找到其指數包含字符串,你應該使用這樣一些方法:

public int Test(string value) 
    { 
     List<List<string>> nestedList = new List<List<string>>(); 
     nestedList.Add(new List<string> { "test1" }); 
     nestedList.Add(new List<string> { "test2" }); 
     nestedList.Add(new List<string> { "test3" }); 

     for (int i = 0; i < nestedList.Count; i++) 
     { 
      if (nestedList[i].Any(m => m == value)) 
       return i; 
     } 

     //not found 
     return -1; 
    } 

    //To use: 
    public void Program() 
    { 
     Console.WriteLine("found in index: {0}", Test("test3")); //found in index: 2 
     Console.WriteLine("found in index: {0}", Test("test4")); //found in index: -1 
    }