The lambda one-liner indicated in the snippet below essentially nests at least two “for/foreach” loops. See my related article for full source.
This code snippet is used to populate a drop down list of all factories containing unregistered robots where are not already marked in the list to be decommissioned.
Upon selecting a factory containing unregistered robots, another listbox is populated with the robots so they can be selected from which moves them into the decommissioned list.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Configuration; public partial class DecommissionRobots : System.Web.UI.UserControl { public event EventHandler SendToDecommission; public void Update() { upnlContainer.Update(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { LoadRegions(); txtExpDate_CalendarExtender.SelectedDate = DateTime.UtcNow.AddMonths(6); } } protected void LoadRegions() { using (AndroneticsDataContext db = new TigrentLearningDataContext( ConfigurationManager.ConnectionStrings["AndroneticsConnection1"].ConnectionString)) { ddlRegions.DataSource = db.UP_GET_REGIONS(); ddlRegions.DataTextField = "REGION"; ddlRegions.DataValueField = "REGION_ID"; ddlRegions.DataBind(); ListItem li = new ListItem("", ""); ddlRegions.Items.Insert(0, li); } } protected void ClearLists() { lstUnselectedRobots.Items.Clear(); //you may want to clear other lists in this manner in your app as well } protected void LoadFactories() { ClearLists(); if (ddlSegment.SelectedIndex > 0) { using (AndroneticsDataContext db = new AndroneticsDataContext( ConfigurationManager.ConnectionStrings["AndroneticsConnection1"].ConnectionString)) { List<UP_GET_FactoriesResult> allFactories = db.UP_GET_Factories(Convert.ToInt32(ddlRegion.SelectedValue), null).ToList(); ////this would be approximately how you would approach traditionally //foreach (UP_GET_FactoriesResult r in allFactories) //{ // if (GetUnregisteredRobots(r.FACTORY_ID).Count != 0) // { // //etc, would need another loop here // } //} //now for the lambda way var Factories = allFactories.Where( r => GetUnregisteredRobots(r.FACTORY_ID).Where( ra => !lstDecommissionRobots.Items.Contains(new ListItem(ra.ROBOT_NAME,ra.ROBOT_ID.ToString()))).Count() != 0); ddlFactories.DataSource = Factories; ddlFactories.DataTextField = "FACOTRY_TITLE"; ddlFactories.DataValueField = "FACTORY_ID"; ddlFactories.DataBind(); ListItem li = new ListItem("", ""); ddlFactories.Items.Insert(0, li); } } } private List<UP_LOAD_COURSE_RobotsResult> GetUnregisteredRobots(int courseid) { using (AndroneticsDataContext db = new AndroneticsDataContext( ConfigurationManager.ConnectionStrings["AndroneticsConnection1"].ConnectionString)) { List<UP_LOAD_COURSE_RobotsResult> allRobots = db.UP_LOAD_COURSE_Robots(courseid).ToList(); int userID = int.Parse(Request.QueryString["ID"]); List<string> excregisteredRobots = (from m in db.UP_GET_REGISTERED_Robots(userID) select m.MODULE_NAME).ToList(); return allRobots.Where(m => !excregisteredRobots.Contains(m.MODULE_NAME)).ToList(); } } protected void LoadUnregisteredRobots() { lstUnselectedRobots.Items.Clear(); //we need to make sure a re=d-g.and FACTORY were selected. if (ddlFactories.SelectedIndex > 0 && ddlRegion.SelectedIndex > 0) { //notice this reuses the same code as above any simple retrieves the results for value selected in the dropdown. this value is updated by autopostback true set on the aspx page side. lstUnselectedRobots.DataSource = GetUnregisteredRobots(Convert.ToInt32(ddlFactories.SelectedValue)); lstUnselectedRobots.DataTextField = "Robot_NAME"; lstUnselectedRobots.DataValueField = "Robot_ID"; lstUnselectedRobots.DataBind(); } } protected void btnSelect_Click(object sender, ImageClickEventArgs e) { List<ListItem> selectedItems = new List<ListItem>(); //add all the selected items to a list foreach (ListItem li in lstSelectItems.Items) { if (li.Selected) { selectedItems.Add(li); } } //add the selected items to the selected box lstSelectedItems.Items.AddRange(selectedItems.ToArray()); //remove the selected items from the original list foreach (ListItem items in selectedItems) { lstUnselectedRobots.Items.Remove(items); } LoadFactories(); } protected void btnRemove_Click(object sender, ImageClickEventArgs e) { List<ListItem> selectedItems = new List<ListItem>(); //add all the selected items to a list foreach (ListItem li in lstSelectedItems.Items) { if (li.Selected) { lstDecommissionRobots.Add(li); } } //add the selected items back to the initial selection box lstUnselectedRobots.Items.AddRange(selectedItems.ToArray()); //remove the selected items from the selected list foreach (ListItem items in selectedItems) { lstDecommissionRobots.Items.Remove(items); } LoadFactories(); } protected void btnSend_Click(object sender, ImageClickEventArgs e) { List<USER_ACCESS> FactoryItems = new List<USER_ACCESS>(); int userid= int.Parse(Session["userid"].ToString()); try { if (lstDecommissionRobots.Items.Count > 0) { //for each Factory item that's selected, add it to the Factory list foreach (ListItem li in lstDecommissionRobots.Items) { USER_ACCESS regFactory = new USER_ACCESS() { USER_ID = studentID, Robot_ID = Convert.ToInt32(li.Value), EXPIRATION_DATE = Convert.ToDateTime(txtExpDate.Text), CREATED_BY = Users.CurrentUser.UserID.ToString() }; FactoryItems.Add(regFactory); } //Make sure the list got filled and then insert the Factories into the db. if (FactoryItems.Count > 0) { AndroneticsDAL dalInstance = new AndroneticsDAL(); dalInstance.EnrollStudent(FactoryItems); //TODO: replace with update event handle //PopulateFactories(userid); ClearLists(); lstDecommissionRobots.Items.Clear(); ddlSegment.ClearSelection(); ddlFactories.ClearSelection(); if (SendToDecommission != null) { SendToDecommission(sender,e); } } } else { //PopulateFactories(userid); } } catch (Exception ex) { //Utility.HandleError(ex); //send to email, handle, etc or handle in global.asax } } protected void ddlRegion_SelectedIndexChanged(object sender, EventArgs e) { LoadFactories(); ddlFactories.SelectedItem.Selected = false; } protected void ddlFactories_SelectedIndexChanged(object sender, EventArgs e) { LoadRobots(); } }
HTML/ASPX Side:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DecommissionRobots.ascx.cs" Inherits="DecommissionRobots" %> <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> <asp:UpdatePanel ID="upnlContent" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> <ContentTemplate> <asp:Panel runat="server" ID="pnlFactorieselection" GroupingText="Decommission Robots"> <div class="panelPadding paddingTop10 tableSize"> <div> <div class="displayInlineLeftFloat labelSize"> <asp:Label runat="server" ID="lblRegion" AssociatedControlID="ddlRegion" Text="Region Name:" CssClass="labelSize"></asp:Label></div> <div class="displayInlineLeftFloat FactoryDropDowns"> <asp:DropDownList runat="server" ID="ddlRegion" AutoPostBack="true" OnSelectedIndexChanged="ddlRegion_SelectedIndexChanged"> <asp:ListItem Text="United States" Value="UnitedStats"></asp:ListItem> <asp:ListItem Text="United Kingdom" Value="UnitedKingdom"></asp:ListItem> </asp:DropDownList> </div> </div> <div class="clearFloat paddingTop10"> <div class="displayInlineLeftFloat labelSize"> <asp:Label runat="server" ID="lblFactories" AssociatedControlID="ddlFactories" Text="Factory Name:" CssClass="labelSize"></asp:Label></div> <div class="displayInlineLeftFloat FactoryDropDowns"> <asp:DropDownList runat="server" ID="ddlFactories" AutoPostBack="true" OnSelectedIndexChanged="ddlFactories_SelectedIndexChanged"> </asp:DropDownList> </div> </div> <div class="clearFloat paddingTop10"> <div class="displayInlineLeftFloat labelSize"> <asp:Label runat="server" ID="lblExpDate" AssociatedControlID="txtExpDate" Text="Expiration Date:" CssClass="labelSize"></asp:Label></div> <div class="displayInlineLeftFloat"> <asp:TextBox runat="server" ID="txtExpDate"></asp:TextBox> <asp:CalendarExtender ID="txtExpDate_CalendarExtender" runat="server" DefaultView="Months" Enabled="True" TargetControlID="txtExpDate"> </asp:CalendarExtender> </div> </div> <div class="clearFloat"> <br /> </div> <div> <div> <span class="listWidth displayInline CenterElement">Unregistered Robots</span><span id="selectedCaption" class="listWidth displayInline CenterElement">Selected Robots</span></div> <div id="RegSection" class="displayInlineLeftFloat"> <asp:ListBox ID="lstUnregisteredRobots" runat="server" CssClass="FloatLeft listWidth" Rows="10" SelectionMode="Multiple"></asp:ListBox> <div id="selectButtons" class="floatContainer"> <div> <asp:ImageButton runat="server" ID="btnSelect" AlternateText="select" OnClick="btnSelect_Click" ImageUrl="~/Images/special_right.gif" /></div> <div class="buttonTopMargin5"> <asp:ImageButton runat="server" ID="btnRemove" AlternateText="remove" ImageUrl="~/Images/special_left.gif" OnClick="btnRemove_Click" /></div> </div> <asp:ListBox runat="server" ID="lstDecommissionRobots" Rows="10" SelectionMode="Multiple" CssClass="listWidth"></asp:ListBox> </div> <div id="sendButton"> <asp:ImageButton runat="server" ID="btnSend" AlternateText="Enroll" ImageUrl="~/Images/btn_send.gif" OnClick="btnSend_Click" /></div> </div> </div> </asp:Panel> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="ddlRegion" EventName="SelectedIndexChanged" /> <asp:AsyncPostBackTrigger ControlID="ddlFactories" EventName="SelectedIndexChanged" /> <asp:AsyncPostBackTrigger ControlID="btnSelect" EventName="Click" /> <asp:AsyncPostBackTrigger ControlID="btnRemove" EventName="Click" /> <asp:AsyncPostBackTrigger ControlID="btnSend" EventName="Click" /> </Triggers> </asp:UpdatePanel>
References
Fraction Of The Blogosphere, http://ronniediaz.com/2010/12/21/lambda_functions_in_-net/
Image may be NSFW.
Clik here to view.
Clik here to view.
