2011-03-13 90 views
1

這是我的列表對象更新列表對象 - LINQ

List<MemObject> 
        { 
         new MemObject 
          {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)}, 
         new MemObject 
          {Serial = 1, ErrorCode = "ABD", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)}, 
         new MemObject 
          {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)}, 
         new MemObject 
          {Serial = 1, ErrorCode = "ABC", ModifedAt = new DateTime(2011, 12, 15, 10, 10, 30)}, 
        }; 

我希望通過增加時間一秒鐘,每2,3,... N具有相同的序列記錄更新ModifiedAt領域,錯誤代碼。

這是如何在linq中完成的。

回答

1

這將更新每個ModifiedAt記錄。如果您不想將更新的對象包含在記錄數中,則可能必須執行Count(...) - 1。

memObjects.ForEach(x => x.ModifiedAt.AddSeconds(memObjects.Count(y => y.Serial == x.Serial && y.ErrorCode == x.ErrorCode))); 
0

可能是這樣的嗎?

public void IncrementTime(int serial, string errorCode) 
{ 
    _memObjects.Where(x => x.Serial == serial && x.errorCode == errorCode) 
     .ToList() 
     .ForEach(x => x.ModifiedAt = x.ModifiedAt.Add(new TimeSpan(0, 0, 1))); 
} 
1

這和我所能得到的單個linq語句差不多。它確實工作。

public void IncrementTime(int serial, string errorCode) 
    { 
     var matchObjects = _memObjects.Where(x => x.Serial == serial && x.ErrorCode == errorCode).ToList(); 

     matchObjects.ForEach(x => x.ModifedAt = x.ModifedAt.AddSeconds(
            matchObjects.Count(y => matchObjects.IndexOf(y) < matchObjects.IndexOf(x)) 
          )); 
    } 
0

LINQ在這裏不會真的幫到你。它並不意味着用於更新集合,而是通過它們進行搜索。你不應該期望更多。正確使用,您可以對項目進行分組並根據您的要求更新項目。

// group the MemObjects by Serial and ErrorCode that has more than 1 occurrences 
var query = list.GroupBy(mo => new { mo.Serial, mo.ErrorCode }) 
       //.Where(g => g.Count() > 1); // O(n) 
       .Where(g => g.Skip(1).Any()); // O(1) 

// make the updates 
foreach (var group in query) 
{ 
    int i = 1; 
    foreach (var mo in group) 
    { 
     mo.ModifedAt += TimeSpan.FromSeconds(i++); 
    } 
}