在ListBox中移动项目

时间:2011-08-10 18:50:58

标签: c# sorting listbox contains

我有一个ListBox,里面有很多项。但是,我希望能够根据项目中的匹配对列表中的项目进行排序。

所以,如果我在ListBox中有一些看起来像这样的项目:

U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL  
FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 

除非项目包含“FID”,否则我希望能够保持一切相同。此时我想将它们添加到ListBox的顶部并按数字顺序..所以换句话说, NEW ListBox将如下所示:

FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    

我正在使用这样的东西:

if (aListBox.Items.Contains("FID"))
{
    # I don't know what to put in here to make it grab the Item and move it
    # to the top of the List and also numerically ordering them.
}

- 任何人都可以帮忙吗?

提前致谢:)

修改

foreach (var item in listOneLines)
    if (item.Contains("FID "))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID0"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID1"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID2"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID3"))
        ListBox.Items.Add(item);
foreach (string item in listOneLines)
    if (!item.Contains("FID"))
        ListBox.Items.Add(item);

ListBox循环如下:

FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL    #From here down is what
FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL    #I want to be removed.
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 

2 个答案:

答案 0 :(得分:2)

您可以在填充listBox时以多种方式对项目进行分组或排序 我在下面给出了一些例子。它们不一定是最令人惊讶的解决方案,但我认为通过看到一些可能性而不是通过提供一个神秘或“聪明”的解决方案,你将学到更多。这些也说明了如何在列表中的不同位置插入(如问题中所述)。

将一个列表分成两个(未排序)列表的简单方法是添加到结尾或插入列表的开头(不是一种非常有效的方法,但通常这不是UI代码中的相关问题除非你有大型名单):

foreach (string item in itemList)
{
    if (item.Contains("FID"))
        listbox.Items.Insert(0, item);  // Add at start of list
    else
        listBox.Items.Add(item);        // Add at end of list
}

(请注意,FID项目将以相反的顺序显示)

或者在两遍中添加项目:

foreach (string item in itemList)
{
    if (item.Contains("FID"))
        listbox.Items.Add(item)    // Add all items with FID in them
}
foreach (string item in itemList)
{
    if (!item.Contains("FID"))
        listbox.Items.Add(item)    // Add all items without FID in them
}

或者找到每个项目的插入位置:

foreach (string item in itemList)
{
    int insertPos = 0;
    bool itemIsFID = item.Contains("FID");
    while (insertPos < listBox.Items.Count)
    {
        // Primary sort - put FID items ahead of non-FID items
        bool boxItemIsFID = listBox.Items[insertPos].Contains("FID");
        if (itemIsFID && !boxItemIsFID)
        {
            // The new item must be inserted before the existing item
            break;
        }

        // Secondary sort - alphabetical
        if (item.CompareTo(listBox.Items[insertPos]) > 0)
        {
            // The new item must be inserted before the existing item
            break;
        }
    }

    // Insert the item at the location we've found
    if (insertPos < listBox.Items.Count)
        listBox.Items.Insert(insertPos, item);
    else
        listBox.Items.Add(item);
}

或者最后,您可以通过实施自己的IComparer并使用您的收藏集Sort方法对项目集合进行预排序:

itemList.Sort(MyComparer);
foreach (string item in itemList)
    listbox.Items.Add(item);

答案 1 :(得分:0)

您可以使用IComparer

实现自定义排序

this教程为例或this一个

在自定义排序方法中,您可以轻松地设置排序条件