簡體   English   中英

刪除列表元素並對其重新排序

[英]Remove and reorder list elments

是否可以僅使用C#Linq或lambda表達式而無需使用C#循環(foreach; for; while;等)來解決以下問題?

問題:給定Task對象列表和已刪除TaskId列表。 我想該列表僅與不在刪除TaskID的列表中的要素更新,剩下的任務元素重新排序了。

細節:

(1*) Given a list of Task objects:

TaskId  Group   Name    Order


281        1    "abc"   1  
726        1    "dre"   2  // note: will be removed  
9891       1    "euf"   3  // note: will be removed  
87         1    "wop"   4  
932        1    "hjd"   5  

102        2    "fhl"   1  // note: will be removed  
44         2    "bgg"   2  
30         2    "qds"   3  
293        2    "djf"   4  // note: will be removed  
389        2    "hkd"   5  

12         3    "hjf"   1  
900        3    "xdf"   2  // note: will be removed  


(2*) Given a list of removed TaskIds:  
TaskId  
726  
9891  
102  
293  
900  

現在,在基於列表(2 *)刪除列表(1 *)之后,我希望列表(1 *)看起來像(注意:其余元素的順序也被更新了):

列表(1 *)已更新:

TaskId  Group   Name    Order  

281        1    "abc"   1  
87         1    "wop"   2  // note: new order  
932        1    "hjd"   3  // note: new order  

44         2    "bgg"   1  // note: new order  
30         2    "qds"   2  // note: new order  
389        2    "hkd"   3  // note: new order  

12         3    "hjf"   1  // note: order is kept unchanged.    

Task類的定義如下:

 public class Task {
      public int TaskId { get;set; }
      public int Group { get; set;}
      public string Name { get; set; }
      public int Order { get; set;}

}

先感謝您。

var tasks = new[]{
        new Task{TaskId = 281, Group = 1, Name = "abc", Order =1},
        new Task{TaskId = 726 , Group = 1, Name = "dre", Order =2},
        new Task{TaskId = 9891, Group = 1, Name = "euf", Order =3},
        new Task{TaskId = 102, Group = 2, Name = "wop", Order =1},
        new Task{TaskId = 44, Group = 2, Name = "wop", Order =2},
        new Task{TaskId = 30, Group = 2, Name = "wop", Order =3},
        new Task{TaskId = 293, Group = 2, Name = "wop", Order =4},
        new Task{TaskId = 295, Group = 3, Name = "was", Order =1},
};

int[] itemsToRemove = {726, 102, 293};

tasks.Where(task => !itemsToRemove.Contains(task.TaskId))
     .GroupBy(task => task.Group)
     .SelectMany(grp => grp.Select((task, grpIndex) => 
                                   { task.Order = grpIndex + 1; return task; }));

這樣的回報:

TaskId Group   Name Order
281    1       abc  1 
9891   1       euf  2 
44     2       wop  1  
30     2       wop  2 
295    3       was  1
List<Task> tasksList = new List<Task>();
List<int> tasksIds = new List<int>();
List<Task> resultList = tasksList.FindAll(task => !taskIds.Contains(task.TaskId));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM