在C#中怎么使数组是个可变的,数组大小由用户自己输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中怎么使数组是个可变的,数组大小由用户自己输入相关的知识,希望对你有一定的参考价值。

/*可以使用动态分配内存得到。
学C语言模仿很重要,下面的程序仅供参考,一定要自己思考,这样才有提高的*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define Status int
typedef struct Array

int data;
struct Array *next;
Array,*Link;
Link ARR;
Status CreateArray()

int n,i;
Link p,q;
ARR=(Link)malloc(sizeof(Array));
printf("输入n的值\n");
scanf("%d",&n);
q=ARR;
ARR->data=n*n;
ARR->next=NULL;
printf("输入元素\n");
for(i=1;i<=n*n;i++)

p=(Link)malloc(sizeof(Array));
scanf("%d",&p->data);
q->next=p;
p->next=NULL;
q=p;

return OK;


void OutArray()

Link p;
int n=0;
p=ARR->next;
printf("数组为\n");
while(p!=NULL)

printf("%4d",p->data);
n++;
p=p->next;
if(n%(int)sqrt(ARR->data)==0)
printf("\n");

printf("\n");

void main()

CreateArray();
OutArray();


参考技术A 我来加你帮你回答所有问题,采纳我哦 参考技术B 用List集合数组操作麻烦 参考技术C ArrayList, Generic追问

那它有没有像C中: int a;
printf();的类似操作? 还有就是上面的两个不是很会

追答

C# != C

追问

能加下我QQ吗?973398474我有点问题想问下

SQLite3 -- 在 C# 中存储可变大小的数组列表

【中文标题】SQLite3 -- 在 C# 中存储可变大小的数组列表【英文标题】:SQLite3 -- storing variable size arraylists in C# 【发布时间】:2013-11-21 00:13:29 【问题描述】:

我从未尝试在我的 SQLite 数据库中存储任何对象,并且对该主题进行一些搜索也没有帮助。我在 .NET 4.5 中使用 VS 2012、NuGet SQLite DLL 和 C#。

以下是我可以看到并推测使用的可用数据类型:integer、int、smallint、tinyint、bigint、bit、varchar(50)、nvarchar(50)、text、ntext、image、money、 float, real, decimal, numeric(18,0), char(10), nchar(10), datetime, guid。

我有必须为每个图形存储的图形点 (x, y)。有可变数量。我目前将这些值存储到一个 ArrayList 中,并且很难弄清楚如何存储它们......

如果我只为存储所有 (x, y) 点的每个图形创建一个专用表,我如何指定可变数量的 (x, y) 坐标以保存在图形表中?使用某些第三方库是否有更简单的方法?谁能想到另一个更简单的解决方案,也许使用我目前可用的技术?

谢谢!

【问题讨论】:

如果将每个作为记录存储在自己的表中没有意义,我个人会将它们作为 JSON 数组存储在字符串 (varchar(MAX)) 字段中。 如果您有很多点,您可能希望将图表存储在 BLOB 中。 我可以使用 BLOB 吗?它不在我的设计器中,也不会显示为可识别的数据类型。 @TrevorElliott 你能提供一两个链接让我开始吗?网络上有太多与我的项目无关的信息,很难找到与我的项目相关的信息。 @TrevorElliot 另外,我假设我没有可用的 varchar(max),只有 varchar(50) 会限制我的 JSON 数组的大小。我有一些非常大的图表,其中包含很多 (x, y) 点。 【参考方案1】:

您可以按照建议对对象进行序列化 - 尽管这样会扼杀关系数据库的意义。

或者您可以使用数据库关系。

Graph

-id integer
-varchar(50) name


GraphPoints
-GraphID int FK to Graph
-x int
-y int

然后把两者结合起来,就可以得到表的所有积分:

SELECT * FROM Graph g INNER JOIN GraphPoints gp on g.id = gp.GraphID
WHERE g.id = somegraphid

【讨论】:

我一直在争论这样做,但我总是遇到同样的问题。如何在单个表中表示可变数量的 (x, y) 坐标?顺便说一句,我在 SQL 语法方面是个菜鸟,如果我在你的答案中遗漏了什么,请原谅我。 这里每行有一个坐标。所以返回的结果数量会有所不同,当读取它时,您将对其进行迭代并将其添加到具有可变长度的内存集合中(如 ArrayList,或者更好的是泛型集合)。 啊,我现在明白了。诚然,如您所说,序列化对于 SQLite 来说是不符合规定的,因为它是关系型的,但是对于这种情况,这样做是否更有意义?我在两者之间来回走动,这似乎是更多的工作,最终更令人费解。我希望有人将有关 JSON 数组的更多信息发布到 varchar,以便我进行比较!你会推荐什么? 如果您需要存储许多不同类型的对象,并且不想对它们进行太多报告,而只是想要存储,那么 JSON 就可以了。但如果只是一种对象,为什么每次都要付出序列化和反序列化的代价呢?我会自己使用图表。【参考方案2】:

我最终使用了 JSON,因为它比仅为我的图形坐标创建整个表更容易管理且代码更少,这似乎是适合我的情况的最佳途径。希望这对将来的人有所帮助!

[Serializable]
public class Coordinate

    public string x  get; set; 
    public string y  get; set; 

    public Coordinate() 


public class CoordinateList

    public List<Coordinate> Coordinate  get; set; 

这是一个简单的工作示例,说明如何创建上述类并将其序列化为 JSON 字符串,您可以在 SQLite 3 中将其存储为 TEXT 或 VARCHAR 类型。还包括如何反序列化。

CoordinateList list = new CoordinateList();
list.Coordinate = new List<Coordinate>();
Coordinate cord = new Coordinate();
cord.x = "1";
cord.y = "10";
list.Coordinate.Add(cord);
list.Coordinate.Add(cord);
list.Coordinate.Add(cord);

JavaScriptSerializer serializer = new JavaScriptSerializer();
String jsonStr = serializer.Serialize(list);
MessageBox.Show("json:" + jsonStr);
list = serializer.Deserialize<CoordinateList>(jsonStr);
foreach (Coordinate c in list.Coordinate)

    MessageBox.Show("x: " + c.x + ", y: " + c.y);

P.S. JavaScriptSerializer 包含在 System.Web.Extentions 参考中。我一直在寻找 System.Web.Script.Serialization 命名空间,但找不到。

特别感谢这些很难找到的链接:

Cannot find JavaScriptSerializer in .Net 4.0

Json string deserialized to array list of objects

【讨论】:

以上是关于在C#中怎么使数组是个可变的,数组大小由用户自己输入的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何定义一个可变大小的数组

使struct对象拥有可变大小的数组

可变数组怎么初始化(可变大小的对象不能被初始化)?

在 C 中初始化指针数组 - 可变大小的对象可能未初始化

C中指向可变长度数组的指针的类型是啥?

iOS 中 关于 NSUserDefault中存储可变数组的问题