public static Record FindOrCreate(this IEnumerable<Record> ienumerable, string name)
{
if (ienumerable.Where(element => element.Name == name).FirstOrDefault() != null)
return ienumerable.Where(element => element.Name == name).FirstOrDefault();
else
{
IEnumerable<Record> result = ienumerable.Concat(new[] {new Record(name, "")});
ienumerable = result;
return ienumerable.Where(element => element.Name == name).FirstOrDefault();
}
}
我知道IEnumerable没有Add方法,但我想继续使用IEnumerable而不是ICollection,在极少数情况下我必须添加一些东西。如果找不到元素,我的methodmalways将返回null。
代码编辑! 所以,现在结果有我想要的所有元素,但是方法仍然返回null对象。我不知道是否可以在扩展方法中切换对象? (就像我做了ienumerable =结果)?
答案 0 :(得分:2)
我认为你试图让IEnumerable<T>
超越它的目的。
IEnumerable<T>
只是一系列元素,这就是IEnumerable<T>
在其界面中没有Add<T>
方法的原因。这是只读的。
我建议您更改扩展方法的实现。
答案 1 :(得分:1)
所以问题是“如果找不到元素,如何修改代码不返回null,但是返回一个新项目?”
public static Record FindOrCreate(this IEnumerable<Record> source, string name)
{
Func<Record,bool> pred = element => element.Name == name;
return source.Any(pred) ? source.FirstOrDefault(pred) : new Record(name, "");
}
或
public static Record FindOrCreate(this IEnumerable<Record> source, string name)
{
return source.FirstOrDefault(element => element.Name == name) ?? new Record(name, "");
}
如果问题是“我如何向IEnumerable<Record> source
添加新项目,那么简短的答案是你不能。更长的答案是将来源转换为ICollection
然后添加它但在那时,您可以指定您需要ICollection<T>
注意,当我说“你不能”时,我并不是说“你不应该”,实际上,IEnumberable无法添加项目。考虑尝试向以下seq
public IEnumerable<int> ShortSeq()
{
yield return 0;
}
var seq = ShortSeq();