2015-12-22 5 views
1

Я пытаюсь сравнить два списка Sharepoint. Я использую программу C# для добавления, обновления и удаления элементов на основе его идентификатора. Если идентификатор не существует в List1, когда программа запущена, я хочу удалить идентификаторы из List2. Мне было интересно, как я могу удалить эти элементы без указания определенного числа в функции GetItemById? Как и в этом exampleСравните список Sharepoint с C#

using(ClientContext context = new ClientContext(siteUrl)) { 
    //Retrieve list items from list 1 here code here 

    using(ClientContext target = new ClientContext(siteUrl2)) { 
    foreach(ListItem oListItem2 in collListItem2) { 
     int exists = 0; 
     foreach(ListItem oListItem in collListItem) { 
     if (oListItem2["ID"] == oListItem["ID"]) { 
      exists++; 
     } 
     } 
     if (exists == 0) { 
     ListItem DeleteItem = list2.GetItemById(); 
     DeleteItem.DeleteObject(); 
     target.ExecuteQuery(); 
     } 
     return; 
    } 
    } 
} 

ответ

0

Чтобы удалить элементы из второго списка не в первом, просто получить все элементы из первого списка и фильтрации элементов во втором списке на основе этих идентификаторов. Обратите внимание, вы можете использовать поиск на основе хеширования, чтобы значительно улучшить производительность по сравнению с линейным поиском:

var idsFromFirstList = new HashSet<int>(
    collListItem.AsEnumerable() 
     .Select(item => item.Id)); 

var itemsToDelete = collListItem2.AsEnumerable() 
    .Where(item => !idsFromFirstList.Contains(item.Id); 

foreach(var item in itemsToDelete) 
    item.DeleteObject(); 

target.ExecuteQuery(); 

Заметим, что вы в принципе можете сделать прямо противоположное, чтобы найти элементы, чтобы добавить (создать HashSet из идентификаторов элементов в цель в набор, найти все элементы в первом нет олова там, а затем добавить все эти элементы).

Чтобы найти элементы, которые соответствуют вы можете использовать Dictionary<int, ListItem>, поставив либо набора элементов в словарь, с идентификатором в качестве ключа, и происходит через другой набор, найти спички. Если вы являются собирается сделать это, вы можете повторно использовать этот словарь для проверки одного из двух других условий, а также, чтобы сохранить вам одну структуру данных:

var firstSiteItemLookup = collListItem.AsEnumerable() 
    .ToDictionary(item => item.Id, item => item); 

foreach(var item in collListItem2) 
{ 
    ListItem match; 
    if(firstSiteItemLookup.TryGetValue(item.Id, out match)) 
     UpdateItemToMatch(item, match); 
    else 
     item.DeleteObject(); 
} 

target.ExecuteQuery(); 
0

Вы можете использовать один и тот же код проверить, был ли ID в collListItem изменен, а затем обновить один и тот же идентификатор в collListItem2? @Servy

Смежные вопросы