2013-02-27 2 views
3

У меня есть список подробностей о большом количестве файлов. Этот список содержит идентификатор файла, дату последнего изменения и путь к файлу. Проблема в том, что есть дубликаты файлов, которые являются более старыми версиями и иногда имеют разные пути к файлам. Я хочу хранить только самую новую версию файла независимо от пути к файлу. Поэтому я создал цикл, который выполняет итерацию через упорядоченный список, проверяет, является ли идентификатор уникальным, и если да, то он сохраняется в новом уникальном списке.Удаление дубликатов из отсортированного списка C#

var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate); 

      List<Item> unique = new List<Item>(); 

      string curAssetId = null; 

      foreach (Item result in ordered) 
      { 
       if (!result.ID.Equals(curAssetId)) 
       { 
        unique.Add(result); 
        curAssetId = result.ID; 
       } 
      } 

Однако это все еще позволяя дубликатов в БД, и я не могу понять, почему этот код не работает, как ожидалось. По дубликатам я имею в виду, что файлы имеют одинаковый идентификатор, но разные пути к файлу, которые, как я уже говорил, не должны быть проблемой. Мне просто нужна последняя версия, независимо от ее пути. Может ли кто-нибудь еще увидеть, в чем проблема? Благодаря

var ordered = listOfItems.OrderBy(x => x.AssetID).ThenByDescending(x => x.LastModifiedDate); 
      List<Item> uniqueItems = new List<Item>(); 

      foreach (Item result in ordered) 
      { 
       if (!uniqueItems.Any(x => x.AssetID.Equals(result.AssetID))) 
       { 
        uniqueItems.Add(result); 

       } 
      } 

это то, что у меня есть сейчас, и это все еще позволяет дубликаты

+0

Каково точное значение вашей 'LastModifiedDate'? этот 'date' имеет' hour: mm: ss'? – spajce

+0

Да, это формат – RebeccaD

+0

попытайтесь получить точное значение даты без 'hour: mm: ss' и используйте' .Distinct'. вы можете попробовать мой ответ. – spajce

ответ

3

Это потому, что вы не ищете весь список, чтобы проверить, является ли уникальный идентификатор или не

List<Item> unique = new List<Item>(); 

     string curAssetId = null; // here is the problem 

     foreach (Item result in ordered) 
     { 
      if (!result.ID.Equals(curAssetId)) // here you only compare the last value. 
      { 
       unique.Add(result); 
       curAssetId = result.ID; // You are only assign the current ID value and 
      } 
     } 

, чтобы решить эту проблему, измените следующие

 if (!result.ID.Equals(curAssetId)) // here you only compare the last value. 
     { 
      unique.Add(result); 
      curAssetId = result.ID; // You are only assign the current ID value and 
     } 

до

if (!unique.Any(x=>x.ID.Equals(result.ID))) 
     { 
      unique.Add(result); 

     } 
+0

Этот метод по-прежнему допускает дубликаты. Можете ли вы придумать что-нибудь еще, что я все еще могу пропустить? спасибо – RebeccaD

+0

Я не верю в это, просто внеся поправки в часть ответа – TalentTuner

+0

Я добавил то, что у меня теперь есть в своей программе вверху, и по-прежнему разрешает дубликаты. Очень странно – RebeccaD

1

var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate).Distinct() ??

0

Для этого вам необходимо создать собственный EquityComparer, после чего вы можете использовать метод Distinct Linq. Enumerable.Distinct at msdn

Кроме того, я думаю, вы могли бы остаться с текущим кодом, но вы должны изменить его таким образом (как образец):

var ordered = list.OrderByDescending(x => x.LastModifiedDate); 
    var unique = new List<Item>(); 

    foreach (Item result in ordered) 
    { 
     if (unique.Any(x => x.ID == result.ID)) 
      continue; 
     unique.Add(result); 
    } 
2

Я не знаю, если этот код просто упростили, но считаете ли вы группировку по идентификатору, сортировку по LastModifiedDate, а затем просто взятие первой из каждой группы?

Что-то вроде:

var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First()); 
+0

Я пробовал этот метод, и он по-прежнему сохраняет дубликаты. Кажется, не имеет смысла, как все это происходит – RebeccaD

+0

Вы уверены, что в вашем списке есть полный набор предметов? Вы получите дубликаты идентификаторов, если вы не работаете со всем. –

+0

Этот ответ был идеален для проблемы, с которой я столкнулся, когда я хотел группировать записи по идентификатору, а затем сортировать по каждой группе и получать только первую запись из каждой группы, а все - в одну перечислимую. Благодарю. – Klaw

0
List<Item> p = new List<Item>(); 
var x = p.Select(c => new Item 
    { 
     AssetID = c.AssetID, 
     LastModifiedDate = c.LastModifiedDate.Date 
    }).OrderBy(y => y.id).ThenByDescending(c => c.LastModifiedDate).Distinct(); 
+0

Проблема в том, что мне нужно время в дате, потому что это было требование программы. Я все равно попробовал ответить, но теперь никаких записей не возвращаются. – RebeccaD

+0

используйте '.ToList()' место после '.Distinct()'. выглядит как '.Distinct(). ToList();' – spajce

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