2015-12-08 4 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!"); 
} 

Когда элементы Enumerable являются 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 
    } 
Смежные вопросы