リストボックスから多数のアイテムを取得し、それらを配列に追加して並べ替えてから、別のリストボックスに戻したいと思います。これが私が思いついたものです:
ArrayList q = new ArrayList();
foreach (object o in listBox4.Items)
q.Add(o);
q.Sort();
listBox5.Items.Add(q.ToString());
しかし、それは機能しません。何か案は?
ArrayList q = new ArrayList();
foreach (object o in listBox4.Items)
q.Add(o);
}
q.Sort();
listBox5.Items.Clear();
foreach(object o in q){
listBox5.Items.Add(o);
}
ListBox.Sorted 組み込み機能を使用できます
foreach (object o in listBox4.Items)
{
listBox5.Items.Add(o);
}
listBox5.Sorted = true;
ListBox5.Sorted = trueを設定すると、リストボックス内のアイテムが並べ替えられ、リストボックスに追加された後続のアイテムが正しい順序で追加されます。
もちろん、これは、例で示されているように、単純なソート要件があることを前提としています。
これを試して:
var list = lstBox.Items.Cast<ListItem>().OrderBy(item => item.Text).ToList();
lstBox.Items.Clear();
foreach (ListItem listItem in list)
{
lstBox.Items.Add(listItem);
}
値で並べ替える必要がある場合は、item.Textをitem.Valueに切り替えるだけです。
楽しい!
アイテムを配列に追加し、ループを閉じます。次に、配列値を並べ替えてリストボックスにバインドします
AddRangeをお試しください
ArrayList q = new ArrayList();
foreach (object o in listBox4.Items)
q.Add(o);
q.Sort();
listBox5.Items.AddRange(q.ToArray());
リストボックスの説明を並べ替える
void sort()
{
if (listBox1.Items.Count <= 1)
return;
for (int j = 0; j < listBox1.Items.Count - 1; j++)
{
for (int i = 0; i < listBox1.Items.Count - 1; i++)
{
listBox1.SetSelected(i, true);
string a = listBox1.SelectedItem.ToString();
listBox1.SetSelected(++i, true);
i--;
string b = listBox1.SelectedItem.ToString();
if (b.CompareTo(a) == 1)
{
listBox1.Items.RemoveAt(i);
listBox1.Items.Insert(i, b);
i++;
listBox1.Items.RemoveAt(i);
listBox1.Items.Insert(i, a);
i--;
}
}
}
}
.Net3.5を使用している場合は、linqを使用してこのタスクを完了します。ここでは、リストを使用して変換と並べ替えを行いました。
var list = ListBox1.Items.Cast<ListItem>().Select(item => item.Value).ToList();
list.Sort();
ListBox2.DataSource =list;
ListBox2.DataBind();
また、私が書いた「拡張メソッド」を使用することもできます。
public static class ExtensionMethods
{
public static void Sort(this ListControl lb, bool desc = false)
{
var list = lb.Items.Cast<ListItem>().ToArray();
list = desc
? list.OrderByDescending(x => x.Text).ToArray()
: list.OrderBy(x => x.Text).ToArray();
lb.Items.Clear();
lb.Items.AddRange(list);
}
public static void SortByValue(this ListControl lb, bool desc = false)
{
var list = lb.Items.Cast<ListItem>().ToArray();
list = desc
? list.OrderByDescending(x => x.Value).ToArray()
: list.OrderBy(x => x.Value).ToArray();
lb.Items.Clear();
lb.Items.AddRange(list);
}
public static void SortByText(this ListControl lb, bool desc = false)
{
lb.Sort(desc);
}
public static void SortRandom(this ListControl lb)
{
var list = lb.Items.Cast<ListItem>()
.OrderBy(x => Guid.NewGuid().ToString())
.ToArray();
lb.Items.Clear();
lb.Items.AddRange(list);
}
}
ASP.NETリストボックスの場合:
private void SortListBox(ListBox oListBox)
{
ListBox oSortedListBox = new ListBox();
oSortedListBox.DataSource = oListBox.Items.Cast<ListItem>().ToDictionary(i => i.Value, i => i.Text).OrderBy(i => i.Value);
oSortedListBox.DataValueField = "Key";
oSortedListBox.DataTextField = "Value";
oSortedListBox.DataBind();
oListBox.Items.Clear();
foreach (ListItem oListItem in oSortedListBox.Items)
{
oListBox.Items.Add(oListItem);
}
}
protected void Sort(ListBox lbox)
{
try
{
List<KeyValuePair<string, string>> ListBoxList = new
List<KeyValuePair<string, string>>();
foreach (ListItem li in lbox.Items)
{
ListBoxList.Add(new KeyValuePair<string, string>(li.Value, li.Text));
}
if (ListBoxList.Count > 0)
{
ListBoxList = ListBoxList.OrderBy(x => x.Value).ToList();
lbox.DataTextField = "Value";
lbox.DataValueField = "Key";
lbox.DataSource = ListBoxList;
lbox.DataBind();
}
}
catch (Exception error)
{
error.WriteEvent();
throw;
}
}
private void SortListBox(ListBox listBox)
{
SortedList<string, string> list = new SortedList<string, string>();
foreach (ListItem i in listBox.Items) {
list.Add(i.Text, i.Value);
}
listBox.Items.Clear();
foreach(KeyValuePair<string, string> i in list){
listBox.Items.Add(new ListItem(i.Key, i.Value));
}
}