Как бы объединить в одно условие вот такой набор правил:
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 значения не имеют, они не участвуют в условиях отбора.
Вы на шаге от ответа: у вас считается __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>. Меня учили, что создавать структуры надо как можно более простые, без излишних накладных расходов и - уметь обосновывать зачем нужны более сложные и громоздкие.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей