преобразование значений java.util.list в строку или другой нормальный формат в vb - PullRequest
0 голосов
/ 14 марта 2012

в моем приложении я извлекаю элементы из файла проекта 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 ]

4 голосов
/ 19 марта 2012

В 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
1 голос
/ 19 марта 2012

Существует два способа работы с коллекциями 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.

0 голосов
/ 22 марта 2012

смог выполнить это, используя tostring, затем вправо и влево, чтобы вырезать то, что мне нужно, гораздо быстрее - не знаю, почему это было удалено до

...