private int AddInternal(object item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } int index = -1; if (!owner.sorted) { InnerArray.Add(item); } else { if (Count > 0) { index = InnerArray.BinarySearch(item); if (index < 0) { index = ~index; // getting the index of the first element that is larger than the search value //this index will be used for insert } } else { index = 0; } Debug.Assert(index >= 0 && index <= Count, "Wrong index for insert"); InnerArray.Insert(index, item); } bool successful = false; try { if (owner.sorted) { if (owner.IsHandleCreated) { owner.NativeInsert(index, item); owner.UpdateMaxItemWidth(item, false); if (owner.selectedItems != null) { // Sorting may throw the LB contents and the selectedItem array out of synch. owner.selectedItems.Dirty(); } } } else { index = Count - 1; if (owner.IsHandleCreated) { owner.NativeAdd(item); owner.UpdateMaxItemWidth(item, false); } } successful = true; } finally { if (!successful) { InnerArray.Remove(item); } } return(index); }