2012-11-01 278 views
2

我有一個包含拆分陣列到另一個陣列

  1. Price
  2. Code

我已經成功地列表劃分到一個數組,但我想一個列表進一步拆分陣列,以便我可以分別得到PriceCode並按升序對Price進行排序。當分類發生時,我需要Code也一起排序,因爲Price是針對特定的Code

因此,這將是這樣的: 原版:

1588,8DNY;1488,ACNY;1288,7DPE;1888,8HUC;1488,8WNH; 

後拆分到arrPrice:

[1588,8DNY],[1488,ACNY],[1288,7DPE],[1888,8HUC],[1488,8WNH] 

第二分割2ndarrPrice:

[1588],[1488],[1288],[1888],[1488] 

第二分割2ndarrCode:

按升序排列
[8DNY],[ACNY],[7DPE],[8HUC],[8WNH] 

排序價格:

[1288],[1488],[1488],[1588],[1888] 

號碼將被相應地進行排序:

[7DPE],[ACNY],[8HUC],[8WNH] 

我第一次分裂後卡住。

if (lblprices.Text != "") 
    { 
     arrprice = lblprices.Text.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 

     Array.Sort(arrprice); 

     for (i = 0; i < arrprice.Length; i++) 
     { 
      arr2 = arrprice[i].Split(','); 
      SQL2 = "SELECT DISTINCT [TP].[TCode], "; 
      SQL2 += "[TP].[TName], "; 
      SQL2 += "[TP].[TName_CN], "; 
      SQL2 += "[TP].[TourType], "; 
      SQL2 += "[TP].[LastUpdateDate], "; 
      SQL2 += "[TP].[ValidityFrom], "; 
      SQL2 += "[TP].[ValidityTo], "; 
      SQL2 += "[CL].[CountryCode], "; 
      SQL2 += "[CL].[CityName] "; 

      SQL2 += "FROM [CL], [TP], [TourItinerary],[TourHotel] "; 

      SQL2 += "WHERE [TP].[Activation] = 1 "; 
      SQL2 += "AND [TP].[TCode] = '" + arr2[1] + "' "; 
      SQL2 += "ORDER BY [TP].[LastUpdateDate] DESC "; 

      objConnTour.Open(); 

      SqlCommand command = new SqlCommand(SQL2, objConnTour); 
      SqlDataReader dataReader = command.ExecuteReader(); 

      if (dataReader.Read()) 
      { 
       html += "<tr><td class=\"border\">" + dataReader["TCode"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TName"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TName_CN"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TType"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["LastUpdateDate"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["ValidityFrom"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["ValidityTo"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["CountryCode"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["CityName"] + "</td>"; 
       html += "<td class=\"border\">from&nbsp;<span class=\"price-red\">S$<b>" + arr2[0] + "</b></span><td/></tr>"; 
      } 

      dataReader.Close(); 

      objConnTour.Close(); 
     } 
    } 
    return html; 

上面的代碼將無法按升序對價格進行排序。正如你可以在我的arr2拆分看到的,我需要CodePrice在一起,因爲我將基於Code從數據庫中檢索數據。

-------- ---------編輯

確定這樣的問題是,如果價格都在1000-1999的,它就會被完全排序。 但是,如果我有價格小於1000,它不會被以升序方式

實施例通過@jekcom

這是當我有沒有排序是使用所提供的代碼的結果的屏幕截圖拆分列表,並檢索他們從數據庫

Original, Unsorted

生,這是一個排序使用@ jekcom的代碼

enter image description here

請注意價格未按升序排序。

+1

你能指出確切位置,你會得到一個錯誤/不工作? – 2pietjuh2

+0

jekcom的回答是錯誤的。請參閱我的代碼或電子郵件 – nawfal

+0

修復複製器,立即嘗試 – jekcom

回答

0

您發佈的代碼不工作,因爲你基於Price不是在排數組數組的一部分。如果你有Linq

if (lblprices.Text != "") 
{ 
    arrprice = lblprices.Text.Split(new char[] { ';' }, 
            StringSplitOptions.RemoveEmptyEntries); 
    var lst = arrprice.OrderBy(x => int.Parse(x.Split(',')[0])).ToList(); 

    for (i = 0; i < lst.Count; i++) 
    { 
     arr2 = lst[i].Split(','); 

     //rest of your code ---------------- 
    } 

這應該工作,在SQL而言,這應該給

ORDER BY PRICE ASC, [TP].[LastUpdateDate] DESC 
+0

當我試圖運行代碼,是給我這個錯誤: 'System.Collections.Generic.List '沒有包含'Length'的定義,也沒有找到接受'System.Collections.Generic.List'類型的第一個參數的擴展方法'Length'你錯過了使用指令或程序集引用?) – ymcCole

+0

@ymcCole你得到了什麼樣的錯誤? – nawfal

+0

@ymcCole哦,請使用'計數'而不是長度。這些事情發生在答案發布時沒有在我們自己的機器編譯:)請找到編輯:) – nawfal

0

您可以使用KeyValuePairList s並使用LINQ對它們進行排序。這樣做的

IList<KeyValuePair<string, decimal>> items = new List<KeyValuePair<string, decimal>>(); 
items.Add(new KeyValuePair<string, decimal>("8DTY", 1589)); 
items.Add(new KeyValuePair<string, decimal>("1DNY", 1688)); 
items.Add(new KeyValuePair<string, decimal>("8DNY", 1888)); 
items.Add(new KeyValuePair<string, decimal>("8DNY", 1588)); 
items.Add(new KeyValuePair<string, decimal>("8ENY", 1589)); 

IOrderedEnumerable<KeyValuePair<string,decimal>> result =items.OrderBy(item => item.Value); 

foreach (var keyValuePair in result) 
{ 
    MessageBox.Show(keyValuePair.Key + " " + keyValuePair.Value); 
} 
0

方式一:

定義自定義comperer排序的陣列 然後將它傳遞給排序方法

的比較器

public class ProductComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     string[] _x = x.Split(','); 
     string[] _y = y.Split(','); 
     double priceY = double.Parse(_y[0]); 
     double priceX = double.Parse(_x[0]); 

     return priceX.CompareTo(priceY); 
    } 
} 

你代碼

if (lblprices.Text != "") 
    { 
     arrprice = lblprices.Text.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 

     Array.Sort(arrprice, new ProductComparer()); 


     for (i = 0; i < arrprice.Length; i++) 
     { 
      arr2 = arrprice[i].Split(','); 
      SQL2 = "SELECT DISTINCT [TP].[TCode], "; 
      SQL2 += "[TP].[TName], "; 
      SQL2 += "[TP].[TName_CN], "; 
      SQL2 += "[TP].[TourType], "; 
      SQL2 += "[TP].[LastUpdateDate], "; 
      SQL2 += "[TP].[ValidityFrom], "; 
      SQL2 += "[TP].[ValidityTo], "; 
      SQL2 += "[CL].[CountryCode], "; 
      SQL2 += "[CL].[CityName] "; 

      SQL2 += "FROM [CL], [TP], [TourItinerary],[TourHotel] "; 

      SQL2 += "WHERE [TP].[Activation] = 1 "; 
      SQL2 += "AND [TP].[TCode] = '" + arr2[1] + "' "; 
      SQL2 += "ORDER BY [TP].[LastUpdateDate] DESC "; 

      objConnTour.Open(); 

      SqlCommand command = new SqlCommand(SQL2, objConnTour); 
      SqlDataReader dataReader = command.ExecuteReader(); 

      if (dataReader.Read()) 
      { 
       html += "<tr><td class=\"border\">" + dataReader["TCode"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TName"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TName_CN"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["TType"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["LastUpdateDate"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["ValidityFrom"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["ValidityTo"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["CountryCode"] + "</td>"; 
       html += "<td class=\"border\">" + dataReader["CityName"] + "</td>"; 
       html += "<td class=\"border\">from&nbsp;<span class=\"price-red\">S$<b>" + arr2[0] + "</b></span><td/></tr>"; 
      } 

      dataReader.Close(); 

      objConnTour.Close(); 
     } 
    } 
    return html; 

數組結果

1288,7DPE 
1488,ACNY 
1488,8WNH 
1588,8DNY 
1888,8HUC 
+0

這個答案是錯誤的。請不要使用字符串比較來代替數字比較。如果價格爲2和12,這會給出錯誤的結果。請在你的字符串比較器中有一個int.Parse – nawfal

0

這裏是你如何使用LINQ

string s = "1588,8DNY;1488,ACNY;1288,7DPE;1888,8HUC;1488,8WNH"; 

var OrderedResult= s.Split(';').ToList<string>() 
        .Select(item => item.Split(',')) 
        .Select(item => new { price = Int32.Parse(item[0]), code = item[1] }) 
        .OrderBy(item => item.price); 

foreach(var item in OrderedResult) 
{ 
    var sql = "select ..... where price=" + item.price + " and code=" + item.code; 
    execute(sql); 
} 
+0

我剛剛編輯你的代碼,使匿名類型更好,希望它確定:) – nawfal

+0

不是一個問題,所有naw :) –