2012-11-01 279 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 :) –