Преобразование значений 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.

Другие вопросы по тегам