如何从目录中的文件名填充的 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();
  }

这是我当前的下拉列表的样子。我想删除重复项。

Dropdown list with duplicates

一些伪代码(充实它 out/making 这是留给发帖人(你)的练习):

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

您需要对它们进行排序,无论是在构建列表时还是在输出时...

在输出中:

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: