Вот код, который я сделал, и он работает, НО только для НЕКОТОРЫХ случаев, а не ВСЕ
blockquote>Возможно, это потому, что вы сравниваете значения, а не индексы:
if (i == 0)
иif (values[i] == values[values.length-1])
должны бытьif (i == values.length - 1)
.А фрагмент кода с меньшим количеством кода и нулевой проверки может выглядеть следующим образом
public static int[] sumNeighbours(int[] input) { if (input == null) { return null; } int[] result = new int[input.length]; for (int i = 0; i < input.length; i++) { int sum = input[i]; if (i > 0) { sum += input[i - 1]; } if (i < (input.length - 1)) { sum += input[i + 1]; } result[i] = sum; } return result; }
Использовать XmlReader
проанализировать большие XML-документы. XmlReader
обеспечивает быстро, передайте только, некэшируемый доступ к данным XML. (Передайте только средства, Вы можете считать XML-файл с начала до конца, но не можете переместиться назад в файл.) XmlReader
использует небольшие объемы памяти и эквивалентен использованию простого читателя SAX.
using (XmlReader myReader = XmlReader.Create(@"c:\data\coords.xml"))
{
while (myReader.Read())
{
// Process each node (myReader.Value) here
// ...
}
}
Можно использовать XmlReader для обработки файлов, которые составляют до 2 гигабайтов (ГБ) в размере.
Касательно: Как считать XML из файла при помощи Визуального C#
Только, чтобы суммировать, и сделать ответ немного более очевидным для любого, кто находит этот поток в Google.
До.NET 2 XmlTextReader был большей частью памяти эффективный синтаксический анализатор XML, доступный в стандартном API (спасибо Mitch;-)
.NET 2 представила класс XmlReader, который лучше снова, Это вперед только итератор элемента (немного как синтаксический анализатор StAX). (спасибо Cerebrus;-)
И помните, что деточки, любого экземпляра XML имеет потенциал, чтобы быть больше, чем о 500k, не ИСПОЛЬЗУЙТЕ DOM!
Аплодисменты все. Keith.
Синтаксический анализатор SAX мог бы быть тем, что Вы ищете. SAX не требует, чтобы Вы прочитали весь документ в память - это анализирует через него инкрементно и позволяет Вам обрабатывать элементы, когда Вы идете. Я не знаю, существует ли синтаксический анализатор SAX, предоставленный в.NET, но существует несколько опций с открытым исходным кодом, на которые Вы могли посмотреть:
Вот связанное сообщение:
Asat 14 мая 2009 г .: Я перешел на гибридный подход ... см. Код ниже.
Эта версия имеет большинство преимуществ обоих:
* XmlReader / XmlTextReader (эффективность памяти -> скорость); и
* XmlSerializer (code-gen -> оперативность и гибкость разработки).
Он использует XmlTextReader для итерации по документу и создает «доклеты», которые десериализует с помощью классов XmlSerializer и «привязки XML», сгенерированных с помощью XSD.EXE.
Я полагаю, что этот рецепт универсален и быстро ... Я разбираю XML-документ размером 201 МБ, содержащий 56000 функций GML, примерно за 7 секунд ... старая реализация этого приложения на VB6 занимала минуты (или даже часы), чтобы проанализировать большие фрагменты ... так что я смотрю ' хорошо.
Еще раз, БОЛЬШОЕ Спасибо форумчанам за то, что пожертвовали свое драгоценное время. Я очень ценю это.
Всем привет. Кейт.
using System;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Collections.Generic;
using nrw_rime_extract.utils;
using nrw_rime_extract.xml.generated_bindings;
namespace nrw_rime_extract.xml
{
internal interface ExtractXmlReader
{
rimeType read(string xmlFilename);
}
/// <summary>
/// RimeExtractXml provides bindings to the RIME Extract XML as defined by
/// $/Release 2.7/Documentation/Technical/SCHEMA and DTDs/nrw-rime-extract.xsd
/// </summary>
internal class ExtractXmlReader_XmlSerializerImpl : ExtractXmlReader
{
private Log log = Log.getInstance();
public rimeType read(string xmlFilename)
{
log.write(
string.Format(
"DEBUG: ExtractXmlReader_XmlSerializerImpl.read({0})",
xmlFilename));
using (Stream stream = new FileStream(xmlFilename, FileMode.Open))
{
return read(stream);
}
}
internal rimeType read(Stream xmlInputStream)
{
// create an instance of the XmlSerializer class,
// specifying the type of object to be deserialized.
XmlSerializer serializer = new XmlSerializer(typeof(rimeType));
serializer.UnknownNode += new XmlNodeEventHandler(handleUnknownNode);
serializer.UnknownAttribute +=
new XmlAttributeEventHandler(handleUnknownAttribute);
// use the Deserialize method to restore the object's state
// with data from the XML document.
return (rimeType)serializer.Deserialize(xmlInputStream);
}
protected void handleUnknownNode(object sender, XmlNodeEventArgs e)
{
log.write(
string.Format(
"XML_ERROR: Unknown Node at line {0} position {1} : {2}\t{3}",
e.LineNumber, e.LinePosition, e.Name, e.Text));
}
protected void handleUnknownAttribute(object sender, XmlAttributeEventArgs e)
{
log.write(
string.Format(
"XML_ERROR: Unknown Attribute at line {0} position {1} : {2}='{3}'",
e.LineNumber, e.LinePosition, e.Attr.Name, e.Attr.Value));
}
}
/// <summary>
/// xtractXmlReader provides bindings to the extract.xml
/// returned by the RIME server; as defined by:
/// $/Release X/Documentation/Technical/SCHEMA and
/// DTDs/nrw-rime-extract.xsd
/// </summary>
internal class ExtractXmlReader_XmlTextReaderXmlSerializerHybridImpl :
ExtractXmlReader
{
private Log log = Log.getInstance();
public rimeType read(string xmlFilename)
{
log.write(
string.Format(
"DEBUG: ExtractXmlReader_XmlTextReaderXmlSerializerHybridImpl." +
"read({0})",
xmlFilename));
using (XmlReader reader = XmlReader.Create(xmlFilename))
{
return read(reader);
}
}
public rimeType read(XmlReader reader)
{
rimeType result = new rimeType();
// a deserializer for featureClass, feature, etc, "doclets"
Dictionary<Type, XmlSerializer> serializers =
new Dictionary<Type, XmlSerializer>();
serializers.Add(typeof(featureClassType),
newSerializer(typeof(featureClassType)));
serializers.Add(typeof(featureType),
newSerializer(typeof(featureType)));
List<featureClassType> featureClasses = new List<featureClassType>();
List<featureType> features = new List<featureType>();
while (!reader.EOF)
{
if (reader.MoveToContent() != XmlNodeType.Element)
{
reader.Read(); // skip non-element-nodes and unknown-elements.
continue;
}
// skip junk nodes.
if (reader.Name.Equals("featureClass"))
{
using (
StringReader elementReader =
new StringReader(reader.ReadOuterXml()))
{
XmlSerializer deserializer =
serializers[typeof (featureClassType)];
featureClasses.Add(
(featureClassType)
deserializer.Deserialize(elementReader));
}
continue;
// ReadOuterXml advances the reader, so don't read again.
}
if (reader.Name.Equals("feature"))
{
using (
StringReader elementReader =
new StringReader(reader.ReadOuterXml()))
{
XmlSerializer deserializer =
serializers[typeof (featureType)];
features.Add(
(featureType)
deserializer.Deserialize(elementReader));
}
continue;
// ReadOuterXml advances the reader, so don't read again.
}
log.write(
"WARNING: unknown element '" + reader.Name +
"' was skipped during parsing.");
reader.Read(); // skip non-element-nodes and unknown-elements.
}
result.featureClasses = featureClasses.ToArray();
result.features = features.ToArray();
return result;
}
private XmlSerializer newSerializer(Type elementType)
{
XmlSerializer serializer = new XmlSerializer(elementType);
serializer.UnknownNode += new XmlNodeEventHandler(handleUnknownNode);
serializer.UnknownAttribute +=
new XmlAttributeEventHandler(handleUnknownAttribute);
return serializer;
}
protected void handleUnknownNode(object sender, XmlNodeEventArgs e)
{
log.write(
string.Format(
"XML_ERROR: Unknown Node at line {0} position {1} : {2}\t{3}",
e.LineNumber, e.LinePosition, e.Name, e.Text));
}
protected void handleUnknownAttribute(object sender, XmlAttributeEventArgs e)
{
log.write(
string.Format(
"XML_ERROR: Unknown Attribute at line {0} position {1} : {2}='{3}'",
e.LineNumber, e.LinePosition, e.Attr.Name, e.Attr.Value));
}
}
}