Linq - как бы объединить в одно условие

207
31 декабря 2018, 15:50

Как бы объединить в одно условие вот такой набор правил:

 public class Entry
 {
    public List<string> Paths;
    ..
 }
 public class ExtList
 {
    public string Name;
    ..
 }
        ObservableCollection<Entry> __Entry = ..
        ObservableCollection<ExtList> __ExtList = ..
        List<String> __ls = (from x in __Entry
                where x.Paths.Count > 0 &&
                      x.Paths.Last().Contains('.') &&
                     !x.Paths.Last().StartsWith(".")
                select Path.GetExtension(x.Paths.Last())).ToList();
        List<String> __lsuniq = (from x in __ls
                    orderby x
                    select x).Distinct().ToList();
        __lsuniq.ForEach(x => __ExtList.Add(new ExtList(x)));

Задача вынуть уникальные расширения файлов из списка.

Данные в Entry Paths это разделенный список пути и имени файла, делиться по сепаратору директорий. Например:

   [0] = directory1
   [1] = dir2
   [2] = file.ext

ExtList пустой, в него надо положить. Остальные данные в Entry значения не имеют, они не участвуют в условиях отбора.

Answer 1

Вы на шаге от ответа: у вас считается __lsuniq так как вам надо, осталось только правильно присвоить.

Предлагаю два варианта на выбор.

Первый:

var __ExtList = __lsuniq.Select(x => new ExtList {Name = x}).ToList();

(Полностью код, так как не уверен, что у вас за входные данные):

void Main()
{
    var __Entry = new List<Entry>
    {
        new Entry{
            Paths = new List<string> {
                    "[0] = directory1",
                    "[1] = dir12",
                    "[2] = file.ext",
                },
        },
        new Entry{
            Paths = new List<string> {
                    "[0] = directory2",
                    "[1] = dir22",
                    "[2] = file.zip",
                },
        },
        new Entry{
            Paths = new List<string> {
                    "[0] = directory3",
                    "[1] = dir33",
                    "[2] = file2.zip",
                },
        },
    };
    List<String> __ls = (from x in __Entry
                         where x.Paths.Count > 0 &&
                               x.Paths.Last().Contains('.') &&
                              !x.Paths.Last().StartsWith(".")
                         select Path.GetExtension(x.Paths.Last())).ToList();
    __ls.Dump();
    List<String> __lsuniq = (from x in __ls
                             orderby x
                             select x).Distinct().ToList();
    __lsuniq.Dump();
    var __ExtList = __lsuniq.Select(x => new ExtList {Name = x}).ToList();
    __ExtList.Dump();
}
// Define other methods and classes here
public class Entry
{
    public List<string> Paths;
}
public class ExtList
{
    public string Name;
}

Вывод:

Второй вариант вы написали сами:

var __ExtList = new List<ExtList>();
__lsuniq.ForEach(x => __ExtList.Add(new ExtList(x)));
__ExtList.Dump();

Только чтобы он заработал - нужно добавить конструктор:

public class ExtList
{
    public ExtList(string name)
    {
        this.Name = name;
    }
    public string Name;
}

Либо можно не трогать конструкторы, но тогда записывать так:

__lsuniq.ForEach(x => __ExtList.Add(new ExtList {Name = x}));

PS. Я не знаю, что у вас ещё за поля в ExtList помимо Name - но в текущем виде мне кажется избыточным создавать List<ExtList> когда можно обойтись List<string>. Меня учили, что создавать структуры надо как можно более простые, без излишних накладных расходов и - уметь обосновывать зачем нужны более сложные и громоздкие.

READ ALSO
Проблема с InvalidOperationException

Проблема с InvalidOperationException

В проекте я пытаюсь реализовать "разрыв линии" (то есть при нажатии на линию создается точка, с которой соединяются два элемента)

238
Графики в в Windows Forms или wpf

Графики в в Windows Forms или wpf

С помощью чего можно в Windows Forms или wpf сделать подобный график?

219
Валидация RadioButton&#39;ов в WPF на основе IDataErrorInfo

Валидация RadioButton'ов в WPF на основе IDataErrorInfo

Задача: создать аккуратную систему валидации контролов в Window WPF, причем на основе их взаимосвязиНапример, если стоит RadioButton "пол - женский"...

247
Невозможно вывести число

Невозможно вывести число

В данном ниже коде в строке ConsoleWriteLine("{0}", U); U (по словам компилятора) - локальная переменная, которой не присвоено значение, хотя она была инициализирована...

214