如何从目录中的文件名填充的 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:
我有一个 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: