Преобразование значений java.util.list в строку или другой нормальный формат в vb
В моем приложении я извлекаю элементы из файла проекта Microsoft с помощью mpxj - один из элементов, которые мне нужны, - это предшественники. Способ, которым я могу вытащить предшественника, использует встроенную функцию mpxj, которая возвращает тип java.util.list - я могу сохранить это в переменной как объект, но мне нужно найти способ перенести данные в формат, который я могу легко использовать, чтобы сохранить его в базе данных. Ниже приведена строка кода, которую я использую для извлечения предшественников из файла проекта.
Dim predecessors = task.getPredecessors
и вот результат при установке точки трассировки для получения значения предшественников
[[Relation [Task id=4 uniqueID=45577 name=Standards Training - Round 2] -> [Task id=3 uniqueID=45576 name=Process Excellence Training]]]
Даже если бы я мог получить вышеупомянутое как строку, я мог бы работать с этим достаточно, чтобы получить данные, которые мне нужны. В приведенном выше примере, в списке предшественников есть 1 элемент, но иногда есть несколько элементов. Вот пример точки трассировки, когда есть несколько элементов.
[[Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=47 uniqueID=45857 name=Organizational Assessment]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=49 uniqueID=45859 name=Document Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=56 uniqueID=45866 name=Infrastructure Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=58 uniqueID=45868 name=IT Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=60 uniqueID=45870 name=Organizational Deliverables]]]
Спасибо за помощь.
3 ответа
Смог завершить это, используя tostring, затем направо и налево, чтобы вырезать то, что мне нужно, гораздо быстрее - не знаю, почему это было удалено раньше
В C# 3.5+ создание метода расширения, чтобы дать вам хороший, безопасный для типов перечислитель для этих списков Java, действительно легко из-за yield
ключевое слово. Вы можете сделать это так:
public static class JavaExtensions
{
public static IEnumerable<T> toIEnumerable<T>(this java.util.List list)
{
if (list != null)
{
java.util.Iterator itr = list.iterator();
while (itr.hasNext())
{
yield return (T)itr.next();
}
}
}
}
Пока пространство имен, содержащее это расширение, видимо вашему коду, вы можете просто сделать следующее для работы с предшественниками:
foreach (var relation in task.getPredecessors().toIEnumerable<Relation>())
{
Task sourceTask = relation.getSourceTask();
//etc.
}
К сожалению для вас, вы используете VB.Net. Я был в той же лодке, что и вы, и закончил тем, что создал отдельную библиотеку классов C#, на которую я ссылаюсь в своем проекте VB ASP.NET. Таким образом, я получаю преимущества синтаксиса C# при работе с объектами IKVM в стиле Java без необходимости конвертировать весь мой проект.
Если вы не хотите этого делать, вы можете использовать онлайн-конвертер кода, чтобы изменить код Джона (который не использует только C#-функции) на VB и включить его в ваш проект.
Главное в вашем случае выше, это то, что вам не нужно работать со строковым представлением, которое вы видите в отладчике (это просто вызов toString() для объектов Relation в этом списке). getPredecessors()
функция возвращает список Relation
объекты.
Dim predecessorList as java.util.List = task.getPredecessors()
Dim iter as java.util.Iterator = predecessorList.iterator()
Do While iter.hasNext()
Dim curRelation as Relation = iter.next()
'gets the left side of the relationship (the task you are dealing with)
Dim sourceTask as Task = curRelation.getSourceTask()
'gets the task that is the predecessor to the 'source' task
Dim targetTask as Task = curRelation.getTargetTask()
'from here you can call methods on the Task objects to get their other properties
'like name and id
Loop
Существует два способа работы с коллекциями Java при использовании сборки.Net, созданной IKVM. Первый заключается в том, чтобы делать вещи в стиле Java и работать с итератором:
java.util.List predecessors = task.getPredecessors();
java.util.Iterator iter = predecessors.iterator();
while (iter.hasNext())
{
Relation rel = (Relation)iter.next();
System.Console.WriteLine(rel);
}
Другой способ - добавить немного кода для удобства использования, чтобы скрыть это:
foreach(Relation rel in ToEnumerable(task.getPredecessors()))
{
System.Console.WriteLine(rel);
}
Для этого я создал метод "ToEnumerable":
private static EnumerableCollection ToEnumerable(Collection javaCollection)
{
return new EnumerableCollection(javaCollection);
}
и класс EnumerableCollection, который скрывает использование итератора:
class EnumerableCollection
{
public EnumerableCollection(Collection collection)
{
m_collection = collection;
}
public IEnumerator GetEnumerator()
{
return new Enumerator(m_collection);
}
private Collection m_collection;
}
public struct Enumerator : IEnumerator
{
public Enumerator(Collection collection)
{
m_collection = collection;
m_iterator = m_collection.iterator();
}
public object Current
{
get
{
return m_iterator.next();
}
}
public bool MoveNext()
{
return m_iterator.hasNext();
}
public void Reset()
{
m_iterator = m_collection.iterator();
}
private Collection m_collection;
private Iterator m_iterator;
}
Более интересный способ сделать это - использовать методы расширения, чтобы добавить эту функциональность в классы java Collection, что сделает ваш код менее загроможденным. Я планирую в следующем выпуске попробовать сборку, содержащую полезные методы расширения, как часть MPXJ.