将2D数组php转换为c#数组

时间:2019-10-12 15:37:32

标签: c# php arrays

我想将php函数转换为c#,但是我在c#中的数组中苦苦挣扎, 他们为什么如此困难:/

我的php函数正常工作

foreach ($request->ips as $ip){
      $i = explode(',', $ip);
      if(count($i) == 5) {
         $group_ips[$i[4]][] = ['ip' => $i[0], 'domain' => $i[1], 'idip' => $i[2], 'idddomain' => $i[3]];
      }
 }

我转换为c#

string[][] data = ips.Trim().Split('\n').Select(t => t.Split(',')).ToArray();

var dict = new Dictionary<string, Dictionary<string, object>>();

foreach (string[] item in data)
{
    if (item.Length == 5)
    {
       dict.Add(item[4].ToString(), new Dictionary<string, object>
         {
            {"ip", item[0].ToString() },
            {"domain", item[1].ToString() },
            {"idi", item[2].ToString() },
            {"idd", item[0].ToString() },

         });
    }
}
expect output 
array (size=2)
  2 => 
    array (size=2)
      0 => 
        array (size=4)
          'ip' => string 'xxxx' (length=12)
          'domain' => string 'test.com' (length=8)
          'idip' => string '1' (length=1)
          'idddomain' => string '1' (length=1)
      1 => 
        array (size=4)
          'ip' => string 'xxxxx' (length=24)
          'domain' => string 'change.test.com' (length=15)
          'idip' => string '2' (length=1)
          'idddomain' => string '1' (length=1)
  1 => 
    array (size=2)
      0 => 
        array (size=4)
          'ip' => string 'xxxx' (length=13)
          'domain' => string 'hello.com' (length=9)
          'idip' => string '3' (length=1)
          'idddomain' => string '2' (length=1)
      1 => 
        array (size=4)
          'ip' => string 'xxxxx' (length=24)
          'domain' => string 'pear.hello.com' (length=14)
          'idip' => string '4' (length=1)
          'idddomain' => string '2' (length=1)

但是在尝试使用C#时出现此错误

System.ArgumentException:'具有相同键的项已添加。'

我没有任何帮助吗?

1 个答案:

答案 0 :(得分:0)

您错过了数据结构的一种深度。这就是为什么您得到ArgumentException的原因。您可以通过使用数组索引器dict[key] = value来避免异常。但是它将覆盖先前的值。而是在两个字典之间添加List,以便每个键可以存储多个项目。

它们也是{"idd", item[0].ToString() },上的错字。应该是索引3

string ips = "1.1.1.1,test.com,1,1,2\n 1.1.1.1,change.test.com,2,1,2\n 1.1.1.1,hello.com,3,2,1\n 1.1.1.1:8001,pear.hello.com,4,2,1\n";
var data = ips.Trim().Split('\n').Select(t => t.Split(',')).ToList();

var dict = new Dictionary<string, List<Dictionary<string, object>>>();

foreach (var item in data)
{
    if (item.Length == 5)
    {
        var key = item[4].ToString();

        if (!dict.ContainsKey(key))
        {
            dict[key] = new List<Dictionary<string, object>>();
        }

        dict[key].Add( new Dictionary<string, object>
        {
            {"ip", item[0].ToString() },
            {"domain", item[1].ToString() },
            {"idip", item[2].ToString() },
            {"idddomain", item[3].ToString() },
        });
    }
}

Linq版本:

string ips = "1.1.1.1,test.com,1,1,2\n 1.1.1.1,change.test.com,2,1,2\n 1.1.1.1,hello.com,3,2,1\n 1.1.1.1:8001,pear.hello.com,4,2,1\n";

var dict= ips.Trim().Split('\n').Select(t => t.Split(','))
    .Where(item => item.Length == 5)
    .GroupBy(item => item[4])
    .ToDictionary(i => i.Key, i => i.Select(item => new Dictionary<string, string>
        {
            {"ip", item[0] },
            {"domain", item[1] },
            {"idip", item[2] },
            {"idddomain", item[3] },
        }).ToList());
相关问题