2011-05-05 52 views
0
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,但我想留在IEnumerable而不是ICollection,在极少数情况下,我必须添加一些东西。如果它没有找到元素,我的方法返回null。IEnumerable - 我的扩展方法

Code EDITED! 因此,现在结果具有我想要的所有元素,但方法仍然返回空对象。我不知道是否可以在扩展方法中切换对象? (就像我做ienumerable =结果)?

回答

2

我想你试图弯曲IEnumerable<T>超出它的目的。

IEnumerable<T>只是一个元素序列,这就是为什么IEnumerable<T>在它的界面中没有Add<T>方法。它是只读的。

我建议改变你的扩展方法的实现。

+0

是的,我知道这一切的东西,但我真的不在乎欺骗在这一个:) – TrN 2011-05-05 12:22:08

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(); 
+0

差不多。返回新的项目,并把它放在搜索源(把新项目放在IEnumerable ) – TrN 2011-05-05 12:54:11

+0

嘿,我知道我很固执;)。但是我编辑了我的代码,我确信它可以工作,但它没有。但是这是我的最后一次尝试,之后我放了它:P – TrN 2011-05-05 13:56:07

+0

Concat返回一个新的IEnumerable,它不会**修改源 – 2011-05-05 15:09:11