如何清空IEnumerable列表?

时间:2016-07-20 21:16:25

标签: c# asp.net-mvc

我需要清空IEnumerable列表我尝试了许多像null这样的东西,但没有一个工作

我的模型看起来像

public class NewsViewModel
{
    public NewsViewModel()
    {
        this.Categories = new List<Category>();
    }

    public int NewsId { get; set; }
    public string NewsTitle { get; set; }
    public string NewsBody { get; set; }

    public IEnumerable<Category> Categories { get; set; }
}

if (!string.IsNullOrEmpty(SelectedCategoriesIds))
{
    List<Category> stringList = new List<Category>();
    stringList.AddRange(SelectedCategoriesIds.Split(',').Select(i => new Category() { CategoryId = int.Parse(i) }));
    model.Categories = stringList.AsEnumerable();
}
else
{
    model.Categories = null;
}

如何让model.Categories为空?

4 个答案:

答案 0 :(得分:23)

使用Enumerable.Empty<T>()

model.Categories = Enumerable.Empty<Category>();
  

Empty()方法缓存一个TResult类型的空序列。   当它返回的对象被枚举时,它不会产生任何元素。

没有元素的可枚举序列与null不同。如果您为null返回IEnumerable<T>,然后尝试枚举,则会收到NullReferenceException

另一方面,如果你返回Enumerable.Empty<T>()并尝试枚举它,代码将执行得很好而不需要空检查,因为没有要枚举的元素。

值得注意的是,Enumerable.Empty<T>()也比返回new List<T>()更有效,因为不需要分配新的列表对象。

您无法在此实例中使用.Clear(),因为您的IEnumerable<T>是一个可投影序列,在枚举之前未实现。还没有什么可以清除的。

最后,正如下面提到的消费者,这只会更新 特定参考。如果其他任何内容也包含对您IEnumerable<T>的引用,则除非您通过model.Categories明确传入ref,否则它不会反映更改。

或者,您可以转换为List<Category>并调用.Clear(),这将清除基础集合,更新所有引用。但是,在执行此操作时,您还需要执行显式空检查,如其他答案中所述。但请注意,这也是一个非常激进的行动。您不是仅更新此实例,而是更新可能有或没有副作用的所有实例。您需要根据意图和需求确定哪个更合适。

答案 1 :(得分:2)

只需创建空列表并将其设置即可。

model.Categories = new List<Category>();

答案 2 :(得分:1)

如果指定新值

您还可以为此

使用空数组
  if (!string.IsNullOrEmpty(SelectedCategoriesIds))
  {
           List<Category> stringList = new List<Category>();
           stringList.AddRange(
                SelectedCategoriesIds.Split(',')
                     .Select(i => new Category() { CategoryId = int.Parse(i) }));
            model.Categories = stringList.AsEnumerable();
 }
 else
 {
      //set the property to an empty arrary
      model.Categories = new Category[]{};
 }

这比@ DavidL的回答效率低,但却是另一种创建空可枚举的方法

如果枚举始终是一个列表,并且您想要清除它而不是使属性类型为IList

如果你的模型总是有一个列表而你想要清除它,那么改变模型并以这种方式访问​​方法。

 public class NewsViewModel
 {
    public NewsViewModel()
    {
        this.Categories = new List<Category>();
    }
    public int NewsId { get; set; }
    public string NewsTitle { get; set; }
    public string NewsBody { get; set; }

    public IList<Category> Categories { get; set; }

}

然后在你的if语句中你可以使用clear

else
 {
      //Now clear is available
      model.Categories.Clear();
 }

答案 3 :(得分:0)

以这种方式尝试:

(model.Categories as List<Category>)?.Clear();