public void ReloadList() { listView.BeginUpdate(); listView.Items.Clear(); var newListItems = ManualOrdering ? _itemListEnumerator : _itemListEnumerator.OrderBy(x => x.Name); Func <IBasicInfo, ListViewItem> createLvi = x => new ListViewItem(new[] { x.Name, x.Enabled.ToString(), x.GetDetails(), TriggerCounter.GetCounter(x).ToString() }) { Tag = x }; if (_groupKeyGetter != null) { var groups = new Dictionary <string, ListViewGroup>(); var defaultGroup = new ListViewGroup("Ungrouped"); groups.Add("Ungrouped", defaultGroup); foreach (var item in newListItems) { var lvi = createLvi(item); var groupKey = _groupKeyGetter(item); if (string.IsNullOrEmpty(groupKey)) { defaultGroup.Items.Add(lvi); } else { ListViewGroup result; if (!groups.TryGetValue(groupKey, out result)) { result = new ListViewGroup(groupKey); groups.Add(groupKey, result); } result.Items.Add(lvi); } listView.Items.Add(lvi); } listView.Groups.AddRange(groups.OrderBy(x => x.Key).Select(x => x.Value).ToArray()); } else { listView.Items.AddRange(newListItems.Select(createLvi).ToArray()); } listView.EndUpdate(); }