IEnumerable - 我的扩展方法

时间:2011-05-05 11:43:40

标签: ienumerable

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 =结果)?

2 个答案:

答案 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();