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 中看到或所做的任何事情之后进行模式化。特别是,使用数组索引代替适当的成员。

您是否考虑过编写一个包含三个字段来描述消息的类?

于 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 已经声明这是在一个网络服务中,所以我添加了DataContractandDataMember属性。您需要确保项目引用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 回答