522

I want to add a "Select One" option to a drop down list bound to a List<T>.

Once I query for the List<T>, how do I add my initial Item, not part of the data source, as the FIRST element in that List<T> ? I have:

// populate ti from data               
List<MyTypeItem> ti = MyTypeItem.GetTypeItems();    
//create initial entry    
MyTypeItem initialItem = new MyTypeItem();    
initialItem.TypeItem = "Select One";    
initialItem.TypeItemID = 0;
ti.Add(initialItem)  <!-- want this at the TOP!    
// then     
DropDownList1.DataSource = ti;
casperOne
  • 73,706
  • 19
  • 184
  • 253
Ash Machine
  • 9,601
  • 11
  • 45
  • 52

5 Answers5

898

Use the Insert method:

ti.Insert(0, initialItem);
Matt Hamilton
  • 200,371
  • 61
  • 386
  • 320
42

Since .NET 4.7.1, you can use the side-effect free Prepend() and Append(). The output is going to be an IEnumerable.

// Creating an array of numbers
var ti = new List<int> { 1, 2, 3 };

// Prepend and Append any value of the same type
var results = ti.Prepend(0).Append(4);

// output is 0, 1, 2, 3, 4
Console.WriteLine(string.Join(", ", results));

Edit:

If you want to explicitly mutate your given list:

// Creating an array of numbers
var ti = new List<int> { 1, 2, 3 };

// mutating ti
ti = ti.Prepend(0).ToList();

but at that point just use Insert(0, 0)

aloisdg
  • 22,270
  • 6
  • 85
  • 105
  • Depends on the use-case. Prepend() does something else, much better in some situations but will be unacceptable in others. – H H Jan 17 '23 at 09:38
  • @HH `Prepend()` adds a value to the beginning of the sequence. Note that the original sequence is not altered. The result is a whole new sequence. The [Prepend's documentation](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.prepend?view=netframework-4.8&viewFallbackFrom=netframework-4.7) shows a lot of useful example. – aloisdg Jan 17 '23 at 10:49
  • Yes, but a "a whole new sequence" is not what was asked. – H H Jan 17 '23 at 13:10
  • @HH Well you cant still mutate the list by re-assign it, but at the point you might as well use Insert... – aloisdg Jan 17 '23 at 13:51
26

Update: a better idea, set the "AppendDataBoundItems" property to true, then declare the "Choose item" declaratively. The databinding operation will add to the statically declared item.

<asp:DropDownList ID="ddl" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Value="0" Text="Please choose..."></asp:ListItem>
</asp:DropDownList>

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems.aspx

-Oisin

x0n
  • 51,312
  • 7
  • 89
  • 111
7

Use Insert method of List<T>:

List.Insert Method (Int32, T): Inserts an element into the List at the specified index.

var names = new List<string> { "John", "Anna", "Monica" };
names.Insert(0, "Micheal"); // Insert to the first element
Sina Lotfi
  • 3,044
  • 1
  • 23
  • 30
6

Use List<T>.Insert

While not relevant to your specific example, if performance is important also consider using LinkedList<T> because inserting an item to the start of a List<T> requires all items to be moved over. See When should I use a List vs a LinkedList.

sonnyb
  • 3,194
  • 2
  • 32
  • 42