Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在2d字典中保存数据?_C#_Linq_Dictionary - Fatal编程技术网

C# 在2d字典中保存数据?

C# 在2d字典中保存数据?,c#,linq,dictionary,C#,Linq,Dictionary,从字典和字典0)存储数据的最快方法是什么 saveString+=“|”; saveString+=entry.Key+“:”; int j=0; foreach(entry.Value中的int[]x) { 如果(j>0) saveString+=“;”; int k=0; foreach(整数y在x中) { 如果(k>0) saveString+=“,”; saveString+=y; k++; } j++; } i++; } string dir=Path.Combine(Director

字典
字典0)存储数据的最快方法是什么
saveString+=“|”;
saveString+=entry.Key+“:”;
int j=0;
foreach(entry.Value中的int[]x)
{
如果(j>0)
saveString+=“;”;
int k=0;
foreach(整数y在x中)
{
如果(k>0)
saveString+=“,”;
saveString+=y;
k++;
}
j++;
}
i++;
}
string dir=Path.Combine(Directory.GetCurrentDirectory(),Config.saveDirectory,Config.saveName);
如果(!Directory.Exists(dir))
{
CreateDirectory(dir);
}
File.WriteAllText(Path.Combine(dir,“data.txt”),saveString;
虽然它可以工作,但速度非常慢(而且看起来也不是特别好)


什么工作得更好?

使用StringBuilder而不是浓缩字符串

StringBuilder saveString = new StringBuilder();
...
saveString.Append(...); // Instead of saveString  += ..
...
File.WriteAllText(Path.Combine(dir, "data.txt"), saveString.ToString());

看看序列化。NET框架有几个内置实现:二进制、XML和Json。您也可以尝试。

处理字典和锯齿数组:

// setting up sample data
var data = new Dictionary<string, int[][]>();
int[][] x = new int[][] {new int[]{1,2,3},new int[]{4,5,6}};
data["One"] = x;
x = new int[][] {new int[]{11,12,13},new int[]{24,25,26}};
data["Two"] = x;

// serialization starts here:
MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Dictionary<string, int[][]>));
ser.WriteObject(stream1, data);
要反序列化,只需调用
ReadObject

// reusing the original stream for demonstration purposes - it reality this would be a new stream
stream1.Position = 0;
var data2 = (Dictionary<string, int[][]>)ser.ReadObject(stream1);
//出于演示目的重用原始流-这将是一个新流
1.位置=0;
var data2=(字典)ser.ReadObject(stream1);

我建议使用JSON,而不是发明自己的标记。serializationa\deserialization JSON最流行的lib之一是

你看不到好地方。问题不在于存储数据,而在于获取数据

以您的示例为例,使用低至50个
int[30][30]
(如果我看得正确的话,大约91600个字符串串联)的条目,最多需要6600毫秒!不涉及存储,只涉及连接部分。问题是,每次追加字符串时,都需要从0开始,一直到最后,这浪费了很多时间

你可以阅读Joel Spolsky的文章来了解更多关于这种现象的信息

要解决这个问题,只需使用一个,它是为这些用例设计的。使用完全相同的数据集,它将操作速度从6600毫秒提高到6毫秒

因此,您的初始示例现在使用StringBuilder:

StringBuilder saveString = new StringBuilder();
int i = 0;

foreach (KeyValuePair<string, int[][]> entry in data)
{
    if (i > 0)
        saveString.Append("|");

    saveString.Append(":");

    int j = 0;
    foreach (int[] x in entry.Value)
    {
        if (j > 0)
            saveString.Append(";");

        int k = 0;
        foreach (int y in x)
        {
            if (k > 0)
                saveString.Append(",");

            saveString.Append(y);
            k++;
        }
        j++;
    }

    i++;
}

string dir = Path.Combine(Directory.GetCurrentDirectory(), Config.saveDirectory, Config.saveName);

if (!Directory.Exists(dir))
{
    Directory.CreateDirectory(dir);
}

File.WriteAllText(Path.Combine(dir, "data.txt"), saveString.ToString());
StringBuilder saveString=新建StringBuilder();
int i=0;
foreach(数据中的KeyValuePair条目)
{
如果(i>0)
saveString.Append(“|”);
saveString.Append(“:”);
int j=0;
foreach(entry.Value中的int[]x)
{
如果(j>0)
saveString.Append(“;”);
int k=0;
foreach(整数y在x中)
{
如果(k>0)
saveString.Append(“,”);
saveString.Append(y);
k++;
}
j++;
}
i++;
}
string dir=Path.Combine(Directory.GetCurrentDirectory(),Config.saveDirectory,Config.saveName);
如果(!Directory.Exists(dir))
{
CreateDirectory(dir);
}
File.WriteAllText(Path.Combine(dir,“data.txt”)、saveString.ToString();

对于您可能也感兴趣的工作代码,您可能也感兴趣。第1节第4项。只是一个有用的注释,而不是个人注释。:)非常感谢。这真的很不一样。现在只需要一两秒钟,就可以超过一分钟@斯内克斯:没问题。但是我鼓励您阅读关于字符串如何工作的内部内容以及为什么串联不好:)
// reusing the original stream for demonstration purposes - it reality this would be a new stream
stream1.Position = 0;
var data2 = (Dictionary<string, int[][]>)ser.ReadObject(stream1);
StringBuilder saveString = new StringBuilder();
int i = 0;

foreach (KeyValuePair<string, int[][]> entry in data)
{
    if (i > 0)
        saveString.Append("|");

    saveString.Append(":");

    int j = 0;
    foreach (int[] x in entry.Value)
    {
        if (j > 0)
            saveString.Append(";");

        int k = 0;
        foreach (int y in x)
        {
            if (k > 0)
                saveString.Append(",");

            saveString.Append(y);
            k++;
        }
        j++;
    }

    i++;
}

string dir = Path.Combine(Directory.GetCurrentDirectory(), Config.saveDirectory, Config.saveName);

if (!Directory.Exists(dir))
{
    Directory.CreateDirectory(dir);
}

File.WriteAllText(Path.Combine(dir, "data.txt"), saveString.ToString());