检查列表中特定索引处的列表是否不为空

时间:2019-07-03 17:38:39

标签: c#

如何访问下面list2中的list1并在声明中检查IsnotNull

List<Object> list1= new List<Object>();

List<int> list2= new List<int>();

list1.add(someValue);
list1.add(list2);

Assert.IsNotNull(list1[1]..??);

2 个答案:

答案 0 :(得分:2)

方法如下:

((List<int>)list1[1]).<something>

但是请使用一些体面的变量名。另外,List<Object>是巨大的代码气味。

答案 1 :(得分:1)

@RobIII在他的答案中显示了如何将object的值强制转换为List<int>;但是,真正的问题是,您如何知道list1中哪个位置包含什么?您最终将获得类似于以下代码的代码:

for (int i = 0; i < list1.Count; i++) {
    object item = list1[i];
    switch (item)
    {
        case int x:
            // do some thing with x
            break;
        case string s:
            // do some thing with s
            break;
        case IList list:
            // do some thing with list
            break;
        ....
    }
}

这将变得乏味。

更好的方法是以面向对象的方式工作。例子

public abstract class Property
{
    public string Name { get; set; }
    public abstract void DoSomething();
}

public abstract class Property<T> : Property
{
    public T Value { get; set; }
}

public class StringProperty : Property<string>
{
    public override void DoSomething() =>
        Console.WriteLine($"String of length {Value?.Length}");
}

public class IntListProperty : Property<List<int>>
{
    public override void DoSomething() =>
        Console.WriteLine($"Int list has {Value?.Count} items");
}

现在您可以写

var list1 = new List<Property>{
    new StringProperty { Name = "string property", Value = "hello" },
    new IntListProperty { Name = "Int list", Value = new List<int>{ 2, 3, 5, 7 } }
};

for (int i = 0; i < list1.Count; i++) {
    Property prop = list1[i];
    Console.Write(prop.Name); Console.Write(": "); 
    prop.DoSomething();
}

这称为多态。这意味着多形。您具有不同形状的属性,但是所有属性都有一个Name和一个DoSomething方法。您可以在不同类型的属性上调用此方法,并将不同的事情委派给这些属性。他们每个人都知道该怎么做。