2

を含むリストがあります

  1. Price
  2. Code

Priceリストを配列に分割することができましたが、配列をさらに分割して、と を別々に取得し、を昇順Codeにソートできるようにしたいと考えています。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]

2nd Splitting 2ndarr価格:

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

2番目の分割 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私の分割でわかるように、に基づいてデータベースからデータを取得するため、Codeと を一緒にする必要があります。PriceCode

- - - - 編集 - - - - -

問題は、価格が 1000 ~ 1999 年の場合、完全にソートされることです。ただし、価格が 1000 未満の場合、昇順で並べ替えられません

例は、@jekcom から提供されたコードを使用した結果のスクリーンショットです。

これは、リストを分割してデータベースから生で取得していない場合です

オリジナル、未分類

そして、これは @jekcom のコードを使用してソートされたものです

ここに画像の説明を入力

Price が昇順でソートされていないことに注意してください。

4

4 に答える 4

0

Listのを使用し、KeyValuePairLINQを使用してそれらを並べ替えることができます。

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

これを行う1つの方法:

カスタムコンパイラーを定義して配列をソートし、それを 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 に答える