2015-12-11 5 views
-1

У меня есть проект веб-формы asp.net C#. Я создал раскрывающийся список, привязанный к локальному каталогу загрузки. Каталог содержит видеофайлы. Каждое видео имеет 3 расширения файлов (mp4, ogv и webm). Я хочу, чтобы одно имя каждого файла отображалось в списке без расширения. В настоящее время мой выпадающий список выглядит следующим образом:Как удалить дубликаты из раскрывающегося списка asp.net, заполняемого именами файлов из каталога?

video-1.mp4 
video-1.ogv 
video-1.webm 
video-2.mp4 
video-2.ogv 
video-2.webm 

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

video-1 
video-2 

Вот мой код позади:

protected void Page_Load(object sender, EventArgs e) 
    { 
    if (!IsPostBack) 
    { 
     BindGrid(); 
    } 

    if (!IsPostBack) 
    { 
     string[] filePaths = Directory.GetFiles(Server.MapPath("~/Uploads/")); 
     List<ListItem> files = new List<ListItem>(); 
     foreach (string filePath in filePaths) 
     { 
     var item = new ListItem(Path.GetFileNameWithoutExtension(filePath), filePath); 
     if (!files.Contains(item)) 
     files.Add(new ListItem(Path.GetFileName(filePath), filePath)); 
     } 
     DropDownList1.DataSource = files; 
     DropDownList1.DataTextField = ""; 
     DropDownList1.DataValueField = ""; 
     DropDownList1.DataBind(); 
    } 
    } 
    protected void BindGrid() 
    { 
    string[] filePaths = Directory.GetFiles(Server.MapPath("~/Uploads/")); 
    List<ListItem> files = new List<ListItem>(); 
    foreach (string filePath in filePaths) 
    { 
     files.Add(new ListItem(Path.GetFileName(filePath), filePath)); 
    } 
    GridView1.DataSource = files; 
    GridView1.DataBind(); 
    } 

Это то, что мой текущий выпадающий список выглядит. Я хочу удалить дубликаты.

Dropdown list with duplicates

+1

Вы должны быть в состоянии использовать [Path.GetFileNameWitoutExtension] (https://msdn.microsoft.com/en-us/library/system.io.path. getfilenamewithoutextension (v = vs.110) .aspx), чтобы получить имена файлов без путей. – DHP

+0

Я только что понял, что я написал неправильный код. Код, который я опубликовал, предназначен для списка сетки. Вот код для раскрывающегося списка: –

+0

Я использовал приведенный ниже код balexandre и как мой список не показывает расширение файла. Тем не менее, он все еще показывает повторяющиеся имена. Какие-либо предложения? –

ответ

1

вам нужно сортировать их, либо при создании списка или на выходе ...

в выход:

GridView1.DataSource = files.Select(x => x.Text.Split('.')[0]).Distinct(); 

использованием LINQPad:

enter image description here

в вы можете даже использовать GetFileNameWithoutExtension

foreach (string filePath in filePaths) 
{ 
    var name = filePath.Split('.')[0]; 
    var item = new ListItem(name); 
    if (!files.Contains(item)) 
     files.Add(item); 
} 

использованием LINQPad:

enter image description here

+0

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

+0

@ joey.coyle Я понятия не имею, что вы хотите. Просто добавил 2 изображения, чтобы вы могли видеть ввод и вывод того, что я сказал ... – balexandre

+0

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

1

Некоторые псевдокод (конкретизации его/делает его реальным является упражнением слева плакат (вы)):

protected void BindGrid() 
{ 
    string[] filePaths = Directory.GetFiles(Server.MapPath("~/Uploads/")); 
    List<ListItem> files = new List<ListItem>(); 
    foreach (string filePath in filePaths) 
    { 
    int dotPos = filePath.IndexOf('.'); 
    String sansExt = filePath.Substring(1, dotPos); 
    if (!files.Contains[sansExt] 
    { 
     files.Add(new ListItem(Path.GetFileName(filePath), filePath)); 
    } 
    } 
    GridView1.DataSource = files; 
    GridView1.DataBind(); 
} 

IOW, найти, где "точка" является; удалите расширение с имени файла, скопировав его с начала на это место; посмотрите, уже ли он в общем списке строк; если это не так, добавьте его. Убедитесь, что "." включен в строку, которую вы просматриваете в общем списке, так что только полное имя совпадает (а не его часть).

+0

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

+0

@ joey.coyle: ответ, который вы дали на оба ответа, показывает, что у вас неправильный взгляд на то, что такое переполнение стека. Это не источник свободного труда, и волонтеры не сидят во всем мире, ожидая ваших требований. Ожидается, что все вопросы, задаваемые здесь, будут предпринимать первоначальные усилия, с благодарностью принять помощь, которая им оказана, и предпринять последующие усилия по включению того, чему они научились в свою собственную работу. – halfer