Get Unique Selected Items From Multiple ASP.NET ListBox and Merge them using LINQ

I recently did a short article on Get Selected Items From Multiple ASP.NET ListBox and Merge the results using LINQ. A user pointed out what if you wanted only the unique values from each list. Well here are two options to do that.

Add two list boxes and a button control to your page:

<div>
<
asp:ListBox ID="ListBox1" runat="server" SelectionMode="Multiple">
<
asp:ListItem Text="One" Value="One" />
<
asp:ListItem Text="Two" Value="Two" />
<
asp:ListItem Text="Three" Value="Three" />
<
asp:ListItem Text="Four" Value="Four" />
<
asp:ListItem Text="Five" Value="Five" />
<
asp:ListItem Text="Six" Value="Six" />
<
asp:ListItem Text="Seven" Value="Seven" />
</
asp:ListBox>

<
asp:ListBox ID="ListBox2" runat="server" SelectionMode="Multiple">
<
asp:ListItem Text="One" Value="One" />
<
asp:ListItem Text="Two" Value="Two" />
<
asp:ListItem Text="Three" Value="Three" />
<
asp:ListItem Text="Four" Value="Four" />
<
asp:ListItem Text="Five" Value="Five" />
<
asp:ListItem Text="Six" Value="Six" />
<
asp:ListItem Text="Seven" Value="Seven" />
</
asp:ListBox>

<
br />
<
asp:Button ID="Button1" runat="server" Text="Get Selected Items"
onclick="Button1_Click" />
</
div>

You have two options to select unique values from both the listboxes. You can use Distinct or Union. Here’s the code for both.

Distinct

C#

protected void Button1_Click(object sender, EventArgs e)
{
var distinct = from p in ListBox1.Items.OfType<ListItem>()
.Concat(ListBox2.Items.OfType<ListItem>())
.Where(o => o.Selected)
.Distinct()
select new
{
Text = p.Text
};

foreach (var item in distinct)
{
Response.Write(item.Text + "<br/>");
}
}

VB.NET

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Dim distinct = _
From p In ListBox1.Items.OfType(Of ListItem)() _
.Concat(ListBox2.Items.OfType(Of ListItem)()) _
.Where(Function(o) o.Selected) _
.Distinct() _
Select New With {Key .Text = p.Text}

For Each item In distinct
Response.Write(item.Text & "<br/>")
Next item
End Sub

Union

C#

protected void Button1_Click(object sender, EventArgs e)
{
var list1 = from p in ListBox1.Items.OfType<ListItem>()
.Where(o => o.Selected)
select new
{
Text = p.Text
};

var list2 = from p in ListBox2.Items.OfType<ListItem>()
.Where(o => o.Selected)
select new
{
Text = p.Text
};

var unique = list1.Union(list2);

foreach (var item in unique)
{
Response.Write(item.Text + "<br/>");
}
}

VB.NET

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Dim list1 = _
From p In ListBox1.Items.OfType(Of ListItem)() _
.Where(Function(o) o.Selected) _
Select New With {Key .Text = p.Text}

Dim list2 = _
From p In ListBox2.Items.OfType(Of ListItem)() _
.Where(Function(o) o.Selected) _
Select New With {Key .Text = p.Text}

Dim unique = list1.Union(list2)

For Each item In unique
Response.Write(item.Text & "<br/>")
Next item
End Sub

OUTPUT

image






About The Author

Malcolm Sheridan is a Microsoft awarded MVP in ASP.NET and regular presenter at conferences and user groups throughout Australia. Being an ASP.NET Insider, his focus is on web technologies and has been for the past 10 years. He loves working with ASP.NET MVC these days and also loves getting his hands dirty with JavaScript. He also blogs regularly at DotNetCurry.com. Follow him on twitter @malcolmsheridan

1 comment:

Anonymous said...

Hi,

I happened to see your post and wanted to share a tip on "How to get distinct rows from a list using LINQ:A"

Here is the link:
http://www.mindfiresolutions.com/how-to-get-distinct-rows-from-a-list-using-linqa-779.php

Hope you find it useful and of assistance.

Thanks,
Bijayani