2

我有一个列表,其中包含

  1. Price
  2. Code

我已经设法将列表拆分为一个数组,但我想进一步拆分数组,以便我可以单独获取PriceandCode并将其排序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拆分中看到的那样,我需要CodeandPrice一起,因为我将从基于Code.

- - - - 编辑 - - - - -

好的,问题是如果价格在 1000-1999 之间,它会被完美排序。但如果我的价格小于 1000,则不会以升序方式排序

示例是使用@jekcom 提供的代码的结果截图

这是我没有拆分列表并从数据库中原始检索它们的时候

原始的,未分类的

这是使用@jekcom 的代码排序的

在此处输入图像描述

请注意价格如何没有以升序方式排序。

4

4 回答 4

0

您可以使用 a Listof KeyValuePairs 并使用 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);
}
于 2012-11-01T07:57:26.277 回答
0

这样做的一种方法:

定义您的自定义 Comperer 以对您的数组进行排序,然后将其传递给 sort 方法

比较器

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
于 2012-11-01T08:09:38.863 回答
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);
}
于 2012-11-01T08:23:12.107 回答
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
于 2012-11-01T08:33:56.477 回答