簡體   English   中英

在C#中將數組轉換為多維數組

[英]Convert array to multidimensional array in C#

我對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的表中以一種不錯的方式輸出它。

快速修復:

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等中進行更改。

PHP會引發不良做法,並對數據結構產生可怕的理解。 請不要嘗試在PHP中看到或執行的操作之后的任何樣式。 特別是,使用數組索引代替適當的成員。

您是否考慮過編寫一個具有三個字段來描述消息的類?

嘗試這個,

更改

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); 

理想情況下,您想更改現有功能,但是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;
    }

將函數返回值更改為string[][]並根據需要返回鋸齒狀數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM