0

私はC#でかなり新しいです。このような配列で結果を返す関数があります

[0] => value
[1] => value
[2] => value 
[3] => value 
[4] => value 

しかし、私の場合は [0] [1] [2] がまとまる必要があり、それを PHP で表にしています。これは私の機能です:

public List<string> ReadOpenCalls(int relation)
        {
            IQAssemblyResolver.Initialize(@"C:\Program Files\.....");
            IQSDK IQSDK = new IQSDK();
            string loginTekst = IQSDK.Login("Administrator", "..", "..").GetResult();

            SDKRecordset inboundSet = IQSDK.CreateRecordset("R_ACTIONSCOPE", "CODE, DESCRIPTION, DATECREATED", "FK_RELATION = " + relation, "");
            var messages = new List<string>();
            if (inboundSet != null && inboundSet.RecordCount > 0)
            {
                inboundSet.MoveFirst();

                 do
                 {
                    string code = inboundSet.Fields["CODE"].Value.ToString();
                    string desc = inboundSet.Fields["DESCRIPTION"].Value.ToString();
                    string date = inboundSet.Fields["DATECREATED"].Value.ToString();

                    messages.Add( code);
                    messages.Add( desc);
                    messages.Add( date);


                    inboundSet.MoveNext();
                 }
             while (!inboundSet.EOF);
                return messages;
            } 

            messages.Add("Error niet gelukt");
            return messages;// null;
        }

出力を次のようにしたい:

[0] => [0] => "desc"
       [1] => "code"
       [2] => "date"

PHPのテーブルでこれをうまく出力できるようにします。

4

5 に答える 5

4

非常に簡単な修正:

var messages = new List<string[]>();

...

     messages.Add( new string[] { code, desc, date});

しかし、それは PHP での作業が容易かどうかにも依存します。

おそらく、より良い解決策は、小さなクラスを作成することです。

class MyMessage
{
    public string Code { get; set; }
    public string Desc { get; set; }
    public string Date { get; set; }
}

もちろん、メソッドを次のいずれかに変更する必要があります。

public List<string[]> ReadOpenCalls(int relation) ...
public List<MyClass> ReadOpenCalls(int relation) ...

その変更は ServiceContract などでも行う必要があります。

于 2013-06-11T09:39:09.243 に答える
2

PHP は、悪い習慣とデータ構造の恐ろしい理解を引き起こします。PHP で見たり行ったりしたことの後に何かをパターン化しようとしないでください。特に、適切なメンバーの代わりに配列インデックスを使用します。

メッセージを説明する 3 つのフィールドを持つクラスを作成することを考えたことはありますか?

于 2013-06-11T09:37:44.067 に答える
1

これを試して、

変化する

public List<string> ReadOpenCalls(int relation)

public List<List<string>> ReadOpenCalls(int relation)

変化する

var messages = new List<string>();  

var messages = new List<List<string>>();

そして変更

messages.Add( code);
messages.Add( desc);
messages.Add( date);

List<string> list = new List<string>();
list.Add( code);
list.Add(desc);
list.Add(date);
messages.Add(list); 
于 2013-06-11T09:41:29.443 に答える
1

既存の関数を変更するのが理想的ですがusing System.Linq、結果を生成した後で結果を変更することもできます。

var messages = ReadOpenCalls(relation);
var new messages = messages.Select((a,i) => new {index = i / 3, value = a})
                          .GroupBy (y => y.index, y => y.value)
                          .Select(g => g.ToList())
                          .ToList();

ただし、関数を変更する方がはるかに良いでしょう

リストを直接追加するか

public List<List<string>> ReadOpenCalls(int relation)
    {
        IQAssemblyResolver.Initialize(@"C:\Program Files\.....");
        IQSDK IQSDK = new IQSDK();
        string loginTekst = IQSDK.Login("Administrator", "..", "..").GetResult();

        SDKRecordset inboundSet = IQSDK.CreateRecordset("R_ACTIONSCOPE", "CODE, DESCRIPTION, DATECREATED", "FK_RELATION = " + relation, "");
        var messages = new List<List<string>>();
        if (inboundSet != null && inboundSet.RecordCount > 0)
        {
            inboundSet.MoveFirst();

             do
             {
                string code = inboundSet.Fields["CODE"].Value.ToString();
                string desc = inboundSet.Fields["DESCRIPTION"].Value.ToString();
                string date = inboundSet.Fields["DATECREATED"].Value.ToString();

                messages.Add(new List<string> { code, desc, date});

                inboundSet.MoveNext();
             }
         while (!inboundSet.EOF);
            return messages;
        } 

        messages.Add("Error niet gelukt");
        return messages;// null;
    }

または、値を保持してクラスのリストを返すクラスを作成します

更新 - OP は、これは Web サービスにあると述べているため、属性DataContractDataMember属性を追加しました。プロジェクトが参照していることを確認する必要がありますSystem.Runtime.Serialization

using System.Runtime.Serialization;

[DataContract]
public class Class {

   public Class(string code, string desc, string date) { 
      this.code = code;
      this.desc = desc;
      this.date = date;
   }

   [DataMember]
   public string Code { get;set; }

   [DataMember]
   public string Desc { get;set; }

   [DataMember]
   public string Date { get;set; }
}

そして、あなたの変更された機能

public List<Call> ReadOpenCalls(int relation)
    {
        IQAssemblyResolver.Initialize(@"C:\Program Files\.....");
        IQSDK IQSDK = new IQSDK();
        string loginTekst = IQSDK.Login("Administrator", "..", "..").GetResult();

        SDKRecordset inboundSet = IQSDK.CreateRecordset("R_ACTIONSCOPE", "CODE, DESCRIPTION, DATECREATED", "FK_RELATION = " + relation, "");
        var messages = new List<Call>();
        if (inboundSet != null && inboundSet.RecordCount > 0)
        {
            inboundSet.MoveFirst();

             do
             {
                string code = inboundSet.Fields["CODE"].Value.ToString();
                string desc = inboundSet.Fields["DESCRIPTION"].Value.ToString();
                string date = inboundSet.Fields["DATECREATED"].Value.ToString();

                messages.Add( new Call(code,desc, date));

                inboundSet.MoveNext();
             }
         while (!inboundSet.EOF);
            return messages;
        } 

        messages.Add("Error niet gelukt");
        return messages;// null;
    }
于 2013-06-11T09:54:05.833 に答える
0

関数の戻り値をに変更し、好きなようにジャグ配列string[][]を返します。

于 2013-06-11T09:37:57.990 に答える