获取嵌套列表中的索引值

时间:2015-12-08 21:05:15

标签: c# list

我在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"

,我该怎么办?

4 个答案:

答案 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(add {{ 1}})FirstOrDefault方法:

using System.Linq;

当枚举的元素为if (nestedList[0].FirstOrDefault() == "test1") { Console.WriteLine("Test 1!"); } 时,该方法返回可枚举的第一个元素或class

答案 1 :(得分:0)

这样做:

nestedList[0][0]

第二个[0]访问嵌套列表的索引。由于list[0]给出了列表的第一个元素,list [0] [0]给出了列表第一个元素的第一个元素。

答案 2 :(得分: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是一个工作网络小提琴。

答案 3 :(得分: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
    }