2011-05-05 78 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