繁体   English   中英

如何从目录中文件名填充的asp.net下拉列表中删除重复项?

[英]How do I remove duplicates from an asp.net dropdown list being populated by files names from a directory?

我有一个asp.net C#Webform项目。 我创建了一个绑定到本地上载目录的下拉列表。 该目录包含视频文件。 每个视频都有3个文件扩展名(mp4,ogv和webm)。 我只希望每个文件名之一出现在列表中而没有扩展名。 目前,我的下拉列表如下所示:

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();
  }

这就是我当前的下拉列表。 我要删除重复项。

包含重复项的下拉列表

一些伪代码(充实它/使其成为现实,这是张贴者(您)自己做的一项工作):

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,找到“点”在哪里; 通过从开头复制到该位置来删除扩展名。 查看它是否已经在通用字符串列表中; 如果不是,则添加它。 确保“。” 包含在要搜索通用列表的字符串中,因此只有全名匹配(而不是一部分)。

您需要在构建列表或输出时对它们进行排序...

在输出中:

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

使用LinqPad:

在此处输入图片说明

在列表建筑物中,甚至可以使用GetFileNameWithoutExtension

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

使用LinqPad:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM