2014-01-20 69 views
1

我有此類:如何在C#中使用linq修改列表的某些元素?

public class Document 
{ 
    public string ID { get; set; } 
    public string Type { get; set; } 
    public bool Checked {get;set; } 
} 

我創建使用Enumerable.Repeat靜態方法的一組10種元素的:

var list = Enumerable.Repeat<Document>(
      new Document 
      { 
       ID="1", 
       Type ="someType" 
       Checked = true 
      }, 10).ToList<Document>(); 

這些創建10 Documents都具有相同的屬性。我需要其中的一些,例如,列表list的前5個元素的Checked屬性爲false

我該如何實現它,儘可能地使用linq

回答

2

替代的概念來完成你要求什麼(也比「1」,其他的東西來填充你的ID列):

var list = Enumerable.Range(1, 10) 
        .Select(i => new Document 
        { 
         ID = i.ToString(), 
         Type = "someType", 
         Checked = (i > 5) 
        }).ToList(); 
3

請注意,您的原始示例有一個錯誤,因爲它創建了一個只有1個實際Document對象的10個元素List<Document>。這裏是做

Enumerable 
    .Range(1, 10) 
    .Select(i => 
    new Document() { 
     ID = "1", 
     Type = "someType", 
     Checked = i <= 5 
    }) 
    .ToList(); 

編輯一個更好的方式

改變了代碼更簡單。我最初的反應是編輯一個已經存在的列表,以及下面可以做

list.Take(5).ForEach(x => { x.Checked = false }); 

注意,你可能要定義這種操作簡單的方法ForEach。如果你沒有一個在此定義是一個例子

static class Extensions { 
    internal static void ForEach<T>(this IEnumerable<T> e, Action<T> action) { 
    foreach (var item in e) { 
     action(item); 
    } 
    } 
} 
+0

我在哪裏以及如何將此擴展方法? – anmarti

+0

@anmarti如果您的項目中沒有擴展方法類型,我只需添加一個。我會更新我的示例。這隻需要在同一個命名空間或導入的代碼中,從您要編寫代碼的位置開始 – JaredPar

+1

您還應該注意,使用Linq時,一般的假設是查詢是可鏈接的,因爲它們返回一個新列表而不是修改原創,並且使用這樣的ForEach是不好的做法。儘管如此,這還是相當常見的。 – Magus