2010-01-16 7 views
2

나는 List<ListViewItem>이고 VirtualMode의 ListView에서 사용했습니다.
목록에 5000 개의 항목이 있으며 ListView 열을 클릭 할 때마다 LINQ 및 OrderBy를 사용하여 정렬 할 예정이므로 작성했습니다. 코드 아래 :
List <> OrderBy IComparer?


List<ListViewItem> ListOfItems = new List<ListViewItem>(); 
ListViewColumnSorter lvwColumnSorter; 

void listView1_ColumnClick(object sender, ColumnClickEventArgs e) 
{ 
    try 
    { 
     // Determine if clicked column is already the column that is being sorted. 
     if (e.Column == lvwColumnSorter.SortColumn) 
     { 
      // Reverse the current sort direction for this column. 
      if (lvwColumnSorter.Order == SortOrder.Ascending) 
      { 
       lvwColumnSorter.Order = SortOrder.Descending; 
      } 
      else 
      { 
       lvwColumnSorter.Order = SortOrder.Ascending; 
      } 
     } 
     else 
     { 
      // Set the column number that is to be sorted; default to ascending. 
      lvwColumnSorter.SortColumn = e.Column; 
      lvwColumnSorter.Order = SortOrder.Ascending; 
     } 

     if (lvwColumnSorter.Order == SortOrder.Descending) 
      this.ListOfItems.OrderByDescending(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)); 
     else 
      this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)); 

     this.listView1.VirtualListSize = ListOfItems.Count; 
     this.listView1.Refresh(); 
    } 
    catch { } 
} 

public class CompareListItemsClass : IComparer<ListViewItem> 
{ 
    private CaseInsensitiveComparer ObjectCompare = new CaseInsensitiveComparer(); 
    private SortOrder OrderOfSort; 
    private int ColumnToSort; 

    public CompareListItemsClass(int columnIndex, SortOrder sortOrder) 
    { 
     ColumnToSort = columnIndex; 
     OrderOfSort = sortOrder; 
    } 

    public int Compare(ListViewItem listviewX, ListViewItem listviewY) 
    { 
     // Compare the two items 
     try 
     { 
      compareResult = ObjectCompare.Compare(
       int.Parse(listviewX.SubItems[ColumnToSort].Text), 
       int.Parse(listviewY.SubItems[ColumnToSort].Text)); 
     } 
     catch 
     { 
      compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, 
       listviewY.SubItems[ColumnToSort].Text); 
     } 


     // Calculate correct return value based on object comparison 
     if (OrderOfSort == SortOrder.Ascending) 
     { 
      // Ascending sort is selected, return normal result of compare operation 
      return compareResult; 
     } 
     else if (OrderOfSort == SortOrder.Descending) 
     { 
      // Descending sort is selected, return negative result of compare operation 
      return (-compareResult); 
     } 
     else 
     { 
      // Return '0' to indicate they are equal 
      return 0; 
     } 
    } 

    int IComparer<ListViewItem>.Compare(ListViewItem x, ListViewItem y) 
    { 
     throw new NotImplementedException(); 
    } 
} 

아무 일도 일어나지 않습니다! 최소한 예외는 던질 것으로 예상합니다!
안내 해주실 수 있습니까?
감사합니다.

+2

: 당신은 목록에 결과를 켜고 목록 변수에 다시 할당 할 ToList 방법을 사용할 수 있습니다 따라서 빈 캐치). –

+0

휴식 지점을 추가했습니다 –

답변

4

LINQ 메서드는 컬렉션에 영향을주지 않으며 새 컬렉션을 반환합니다. 어떻게 당신이 그것을가 발생 된 경우 만 예외를 '먹는'경우, 예외를 볼 것으로 예상 할 (

this.ListOfItems = this.ListOfItems.OrderBy(a => a, new CompareListItemsClass(e.Column, lvwColumnSorter.Order)).ToList(); 
4

확장 메서드는 컬렉션을 수정하지 않고 지정된 순서로 컬렉션 항목 시퀀스를 반환합니다. 코드에서 방금 결과를 무시하면 아무 일도 일어나지 않습니다.

컬렉션을 "제자리에 정렬"(즉, 항목의 실제 순서를 수정)해야하는 경우 List<T>.Sort 메서드를 사용하십시오. 그냥 결과를 부정 할 필요가 있기 때문에


편집

는, 그것이 IComparer<T>와보다 Comparison<T>와 함께 할 실제로 쉽게, 내림차순과 오름차순을 구현하려면 ... 여기 예입니다 :

Comparison<ListViewItem> temp = (x, y) => 
{ 
    int xvalue = int.Parse(x.SubItems[e.Column].Text); 
    int yvalue = int.Parse(y.SubItems[e.Column].Text); 
    return xvalue.CompareTo(yvalue); 
}; 

Comparison<ListViewItem> comparison; 
if (lvwColumnSorter.Order == SortOrder.Ascending) 
{ 
    comparison = temp; 
} 
else 
{ 
    comparison = (x, y) => -temp(x, y); 
} 

this.ListOfItems.Sort(comparison); 
+0

리스트 으로 정렬을 내림차순 및 오름차순으로 샘플 코드를 게시 할 수 있습니까? –

+0

감사합니다. Thomas Levesque –

관련 문제