Выберите более высокую версию свойства из списка классов - PullRequest
0 голосов
/ 04 мая 2020

Я задал вопрос здесь: Очистить дубликаты и их экземпляры из списка

Теперь я сталкиваюсь с новой ситуацией, у меня есть модель данных, подобная этой:

  public class AmpFile
    {
        public string filename { get; set; }
        public string actualpath { get; set; }
        public int fileversion { get; set; }
    }

И пример данных, таких как:

| Index | filename        | actualpath                 | fileversion |
|-------|-----------------|----------------------------|-------------|
| 1     | demofile.opt    | d:\optfiles\demofile.opt   | 8           |
| 2     | somefile.opt    | c:\somefile.opt            | 3           |
| 3     | somefile.opt    | f:\files\somefile.opt      | 8           |
| 4     | test.opt        | c:\test.opt                | 5           |
| 5     | demofile.opt    | c:\demofile.opt            | 5           |
| 6     | anothertest.opt | f:\files\anothertest.opt   | 2           |
| 7     | somefile.opt    | c:\somefolder\somefile.opt | 1           |

Хорошо, теперь я хочу найти дубликаты файлов с тем же именем с помощью filename, сохранить более высокую версию с помощью fileversion и удалить остальные дубликаты. .

и под удалением я имею в виду удаление их файлов и из списка тоже.

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

regards.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Linq

myList.Where(x=> 
 x.fileversion != 
   myList.Where(y => x.filename == y.filename).Max(y=>y.fileversion)
       ).Remove();
0 голосов
/ 04 мая 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<AmpFile> files = new List<AmpFile>() {
                new AmpFile() { filename = "demofile.opt", actualpath = @"d:\optfiles\demofile.opt", fileversion = 8}, 
                new AmpFile() { filename = "somefile.opt", actualpath = @"c:\somefile.opt", fileversion = 3}, 
                new AmpFile() { filename = "somefile.opt", actualpath = @"f:\files\somefile.opt", fileversion = 8}, 
                new AmpFile() { filename = "test.opt", actualpath = @"c:\test.opt", fileversion = 5}, 
                new AmpFile() { filename = "demofile.opt", actualpath = @"c:\demofile.opt", fileversion = 5}, 
                new AmpFile() { filename = "anothertest.opt" , actualpath = @"f:\files\anothertest.opt", fileversion = 2}, 
                new AmpFile() { filename = "testfile2.jpg" , actualpath = @":\somefolder\somefile.opt", fileversion = 1}
            };

            List<AmpFile> output = files.OrderByDescending(x => x.fileversion)
                .GroupBy(x => x.filename)
                .Select(x => x.First())
                .ToList();

            List<AmpFile> deleteFiles = files.OrderByDescending(x => x.fileversion)
                .GroupBy(x => x.filename)
                .SelectMany(x => x.Skip(1))
                .ToList();
        }
    }
    public class AmpFile
    {
        public string filename { get; set; }
        public string actualpath { get; set; }
        public int fileversion { get; set; }
    }
}

Вот результаты

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...