我需要清空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
为空?
答案 0 :(得分:23)
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的回答效率低,但却是另一种创建空可枚举的方法
如果你的模型总是有一个列表而你想要清除它,那么改变模型并以这种方式访问方法。
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();