【问题标题】:Creating c# array similar to javascript array创建类似于javascript数组的c#数组
【发布时间】:2014-11-07 18:04:23
【问题描述】:

我是 C# 新手,想知道是否可以在 C# 中创建一个数组,如下所示:

rates[0]['logic_id'] = 12;
rates[0]['line_id'] = ""
rates[0]['rate'] = rateVal;
rates[0]['changed'] = isChanged;

rates[1]['logic_id'] = 13;
rates[1]['line_id'] = ""
rates[1]['rate'] = secvalue;
rates[1]['changed'] = isChanged;

我可以用这样的值在C# 中创建rates 数组吗?

编辑:

我的目标是将rates 数组发送到使用PHP 运行的特定Web API 服务。他们只接受具有上述结构的数组。这就是我想要实现这一目标的原因。

【问题讨论】:

  • C# 中不存在该对象表示法。创建合适的对象有什么不好?
  • 你不想让它强类型并创建一个 Rate 对象吗?
  • C# 中的类型存在是有原因的...
  • 这似乎是XY Problem。你想创建一个数组来解决一些问题,但是你没有描述的问题。除非您从字面上使用 SO 来理解集合(数组、可枚举等),否则如果我们了解您认为数组可以解决的问题,这将符合每个人的最大利益。
  • @Oraz 你已经在下面得到了答案...

标签: javascript c# arrays


【解决方案1】:

这里最好的方法是创建一个Rate 类,该类保存在List<Rate>() 中。

public class Rate
{
    public int LogicId { get; set; }
    public string LineId { get; set; }
    public decimal Rate { get; set; }
    public bool IsChanged { get; set; }
}

public void Populate()
{
    var rates = new List<Rate>();

    var rate = new Rate();
    rate.LogicId = 12;
    rate.LineId = string.Empty;
    rate.Rate = 0;
    rate.IsChanged = true;

    rates.Add(rate);
}

要访问这些值,您可以遍历它们:

foreach(var rate in rates)
{
    //Do something with the object, like writing some values to the Console
    Console.WriteLine(rate.LogicId);
    Console.WriteLine(rate.Rate);
}

【讨论】:

  • +1 - 你也应该注意如何访问这些值。
  • @Dave Zych 如果将“rates”作为列表发送到 Web API,它们如何分隔值。比如分别获取LogicID和LineID?
  • @Oraz 要将其发送到 API,您必须以某种方式对其进行序列化,即将其转换为 XML(如果 API 接受 XML)或 JSON(如果它接受 JSON)。 JSON 更为常见,您可以使用 Newtonsoft.JSON 库将列表转换为 json 数组。代码类似string jsonForApi = json.Serialize(rates);
  • @DaveZych 我添加了对Newtonsof.Json 库的引用,但我找不到任何SerializeJson 方法以List 作为参数。你能帮忙吗?我正在使用.Net Framework 4.0 处理 VS 2010 中的 Windows 服务。
  • 我找到了:var json = Newtonsoft.Json.JsonConvert.SerializeObject(rates)
【解决方案2】:

您可以使用数组来解决它,但它在某种程度上已经过时了。

我的建议是你应该使用List&lt;Dictionary&lt;string, object&gt;&gt;:

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

data.Add(new Dictionary<string, object>());

data[0].Add("rate", rateVal);

然后你可以像 JavaScript 一样使用字典的索引器来访问它:

var rate = data[0]["rate"];

更新

OP 说:

我的目标是将 Rates 数组发送到特定的 Web API 服务,该服务是 使用 PHP 运行。他们只接受上述数组 结构体。这就是我想要实现这一目标的原因。

没问题。如果您序列化该字典列表using JSON.NET,您可以生成一个包含对象数组的 JSON:

[{ "rate": 2 }, { "rate": 338 }]

实际上,.NET List&lt;T&gt; 被序列化为 JSON 数组,Dictionary&lt;TKey, TValue&gt; 被序列化为 JSON 对象,或者换句话说,作为关联数组。

【讨论】:

  • 我需要将数组 rates 发送到使用 PHP 构建的特定 Web API 服务。那么是否可以制作一个字典列表并将它们转换为 JavaScript 数组并将其发送到该 Web 服务?
  • @Oraz,这与发布的问题不同。最好先解决这个问题,然后再发布一个不同的问题。
  • @Oraz 将 JSON.NET 添加到您的解决方案/项目中,一个简单的JsonConvert.Serialize 提供整个字典列表将产生所需的输出。例如,我期望这样的 JSON:[{ "rate": 438, "otherProperty": "whatever" }, { "rate": 4101, "otherProperty": "whatever 2" }]
【解决方案3】:

这可能取决于您的具体需求,但也许您只是想要一个对象列表

首先创建一个类:

class Rate
{
    public int LoginId { get; set; }
    public int? LineId { get; set; }
    public decimal RateValue { get; set; }
    public bool IsChanged { get; set; }
}

然后,在任何你想要的方法中,只需使用:

List<Rate> Rates = new List<Rate>();
Rates.Add(new Rate() {LoginId = 1, LineId = null, RateValue = Rateval, IsChanged = false});
Rates.Add(new Rate() {LoginId = 13, LineId = null, RateValue = SecVal, IsChanged = false});

编辑

我为糟糕的答案道歉,已编辑以解释错误

【讨论】:

  • -1 - 这甚至不会编译。
  • 这也有,大多数人会认为,公共领域的不良做法。
  • @ErikPhilips - 它没有公共字段。它只有私有字段,这是它无法编译的重要原因之一。
  • @MikeChristensen 是的,你是对的。我正在查看示例设置字段,没有注意到缺少访问修饰符。
  • 以后我建议在发布之前在 IDE 中测试您的代码,直到您非常非常熟悉 C#。
【解决方案4】:
public struct Rate
        {
            public int LoginId ;
            public int LineId ;
            public double RateValue ;
            public bool IsChanged;
        }

        public static void makelist()
        {
             List<Rate> Rates = new List<Rate>();
             Rates.Add(new Rate() {LoginId = 1, LineId = null, RateValue = Rateval,IsChanged = false});
        }

这个方法只会保存数据,不会像类一样保存方法。

使用结构中定义的数据类型,内存使用率保持较低,因为它的唯一目的是存储数据。这是变量和类之间的中间点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多