Что самый простой путь к списку кодировок <Строка> в простую Строку, и декодируйте его назад?

Это то, что делает стековый навигатор, он хочет снова загрузить весь экран.

Он просто хранит все для вас, так что когда вы вернетесь назад, все будет там, в каком бы состоянии вы не покинули экран.

Например, вы прокрутили наполовину на определенном экране и перешли на другой экран, теперь вы вернулись, и вы увидите, что ваш экран наполовину прокручен там, где вы оставили.

так что ничего не поделаешь, когда ты вернешься.

Примечание: Если экран перемещался в прошлом и существует в текущем стеке, то переход к экрану снова не вызовет никаких методов жизненного цикла.

Итак, для вашего случая,

вы можете передать ссылку на метод в навигационные параметры. и позвоните, прежде чем начать навигацию.

вот так,

скажем, вы находитесь в screenB и хотите вызвать метод methodSuperCool=()=>{...}, который находится в screenA, из которого вы перешли на текущий экран.

для этого вам нужно будет передать ссылку на метод в параметрах при переходе к screenB с экрана A.

this.props.navigation.navigate('screenB',{methodSuperCool:this.methodSuperCool});
//this to be write in screenA

сейчас на экране B, прежде чем вы перейдете к экрану, вызовите это,

 this.props.navigation.state.params.methodSuperCool() // this can also have params if you like to pass
 this.props.navigation.navigate('screenA') // or goBack() method will also work
5
задан Joel Coehoorn 12 May 2009 в 15:58
поделиться

11 ответов

Вам не нужно делать это вручную. Как указывалось в других ответах, существует множество способов, встроенных или иных, для сериализации / десериализации.

Однако, если вы решили выполнить работу самостоятельно, для этого не требуется , чтобы много кода:

public static string CreateDelimitedString(IEnumerable<string> items)
{
    StringBuilder sb = new StringBuilder();

    foreach (string item in items)
    {
        sb.Append(item.Replace("\\", "\\\\").Replace(",", "\\,"));
        sb.Append(",");
    }

    return (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : string.Empty;
}

Это разделит элементы запятой (, ). Любые существующие запятые будут экранированы обратной косой чертой ( \ ), и любые существующие обратные косые черты также будут экранированы.

public static IEnumerable<string> GetItemsFromDelimitedString(string s)
{
    bool escaped = false;
    StringBuilder sb = new StringBuilder();

    foreach (char c in s)
    {
        if ((c == '\\') && !escaped)
        {
            escaped = true;
        }
        else if ((c == ',') && !escaped)
        {
            yield return sb.ToString();
            sb.Length = 0;
        }
        else
        {
            sb.Append(c);
            escaped = false;
        }
    }

    yield return sb.ToString();
}
1
ответ дан 18 December 2019 в 06:23
поделиться

You could use the .ToArray property on the List<> and then serialize the Array - that could then be dumped to disk or network, and reconstituted with a deserialization on the other end.

Not too much code, and you get to use the serialization techniques already tested and coded in the .net framework.

5
ответ дан 18 December 2019 в 06:23
поделиться

You might like to look at the way CSV files are formatted.

  • escape all instances of a deliminater, e.g. " in the string
  • wrap each item in the list in "item"
  • join using a simple seperator like ,

I don't believe there is a silver bullet solution to this problem.

4
ответ дан 18 December 2019 в 06:23
поделиться

Добавьте ссылку и с помощью в System.Web, а затем:

public static string Encode(IEnumerable<string> strings)
{
    return string.Join("&", strings.Select(s => HttpUtility.UrlEncode(s)).ToArray());
}

public static IEnumerable<string> Decode(string list)
{
    return list.Split('&').Select(s => HttpUtility.UrlDecode(s));
}

В большинстве языков есть пара служебных функций, которые выполняют "процентное" кодирование URL, и это идеально подходит для повторного использования в подобных ситуациях.

5
ответ дан 18 December 2019 в 06:23
поделиться

You could use an XmlDocument to handle the serialization. That will handle the encoding for you.

public static string encode(System.Collections.Generic.List<string> data)
{
    var xml = new XmlDocument();
    xml.AppendChild(xml.CreateElement("data"));
    foreach (var item in data)
    {
        var xmlItem = (XmlElement)xml.DocumentElement.AppendChild(xml.CreateElement("item"));
        xmlItem.InnerText = item;
    }
    return xml.OuterXml;
}

public static string[] decode(string encoded)
{
    var items = new System.Collections.Generic.List<string>();
    var xml = new XmlDocument();
    xml.LoadXml(encoded);
    foreach (XmlElement xmlItem in xml.SelectNodes("/data/item"))
        items.Add(xmlItem.InnerText);
    return items.ToArray();
}
2
ответ дан 18 December 2019 в 06:23
поделиться

Here's an old-school technique that might be suitable -

Serialise by storing the width of each string[] as a fixed-width prefix in each line.

So

 string[0]="abc"
 string[1]="defg"
 string[2]=" :::==--==::: "

becomes

0003abc0004defg0014 :::==--==::: 

...where the size of the prefix is large enough to cater for the string maximum length

3
ответ дан 18 December 2019 в 06:23
поделиться

Я бы просто добавил к каждой строке ее длину и терминатор, указывающий конец длины.

abc
defg
hijk
xyz
546
4.X

становится

3: abc 4: defg 4: hijk 3: xyz 3: 546 3: 4.X

Никаких ограничений или ограничений вообще и достаточно простой.

2
ответ дан 18 December 2019 в 06:23
поделиться

Json.NET - очень простой способ сериализации любого объекта, который вы можете себе представить. JSON сохраняет компактность и может работать быстрее, чем XML.

List<string> foo = new List<string>() { "1", "2" };
string output = JsonConvert.SerializeObject(foo);
List<string> fooToo = (List<string>)JsonConvert.DeserializeObject(output, typeof(List<string>));
2
ответ дан 18 December 2019 в 06:23
поделиться

Включите библиотеку System.Linq в свой файл и измените свои функции на следующие:

    public static string encode(System.Collections.Generic.List<string> data, out string delimiter)
    {
        delimiter = ":";
        while(data.Contains(delimiter)) delimiter += ":";
        return string.Join(delimiter, data.ToArray());
    }
    public static string[] decode(string encoded, string delimiter)
    {
        return encoded.Split(new string[] { delimiter }, StringSplitOptions.None);
    }
0
ответ дан 18 December 2019 в 06:23
поделиться

Why not use Xstream to serialise it, rather than reinventing your own serialisation format?

Its pretty simple:

new XStream().toXML(yourobject)
0
ответ дан 18 December 2019 в 06:23
поделиться

Вам не нужно делать это вручную. Как указывалось в других ответах, существует множество способов, встроенных или иных, для сериализации / десериализации.

Однако, если вы решили выполнить работу самостоятельно, для этого не требуется , что много кода:

public static string CreateDelimitedString(IEnumerable<string> items)
{
    StringBuilder sb = new StringBuilder();

    foreach (string item in items)
    {
        sb.Append(item.Replace("\\", "\\\\").Replace(",", "\\,"));
        sb.Append(",");
    }

    return (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : string.Empty;
}

Это разделит элементы запятой (, ). Любые существующие запятые будут экранированы обратной косой чертой ( \ ), и любые существующие обратные косые черты также будут экранированы.

0
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: