Как сравнить два списка структур? - PullRequest
1 голос
/ 16 сентября 2010

У меня небольшая структура, и я должен сравнить значения, чтобы найти, какие из них имеют тот же текст FreeFlow, а затем получить эту структуру ENumber.

   public struct Holder
    {
        public string FreeFlow;
        public int ENumber;
    }

и вот как я их добавляю

foreach(Class1.TextElement re in Class1._TextElements)
            {
                //create struct with all details will be good for later
                Holder ph = new Holder();
                ph.FreeFlow = re.FreeFlow;
                ph.ENumber = re.ENumber;
                lstHolder.Add(ph);
            }

      foreach(Class1.TextElement2 re in Class1._TextElements2)
            {
                //create struct with all details will be good for later
                Holder phi = new Holder();
                phi.FreeFlow = re.FreeFlow;
                phi.ENumber = re.ENumber;
                lstHolder2.Add(phi);
            }

Я могу сделать сравнение, используя foreach внутри foreach, но я думаю, что это не самый эффективный способ. Любая помощь?

РЕДАКТИРОВАТЬ: я пытаюсь определить, является ли текст свободного потока точно так же, как другой текст структуры свободного потока

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

Я должен сравнить значения, чтобы найти какие из них имеют тот же FreeFlow текст, а затем захватить эту структуру ENumber.

Если вы можете использовать LINQ, вы можете объединить элементы с одинаковым текстом FreeFlow, а затем выбрать значения ENumber для обоих элементов:

var query = from x in Class1._TextElements
            join y in Class1._TextElements2 on x.FreeFlow equals y.FreeFlow
            select new { xId = x.ENumber, yId = y.ENumber };

foreach (var item in query)
{
    Console.WriteLine("{0} : {1}", item.xId, item.yId);
}

РЕДАКТИРОВАТЬ: я понимаю, что FreeFlow текст является общим членом и что ENumber, вероятно, отличается, в противном случае было бы целесообразно определить эквивалентность на основе этого. Если это так, запрос join выше должен быть тем, что вам нужно.

1 голос
/ 16 сентября 2010

Если я правильно вас интерпретирую, вы хотите найти элементы, которые находятся в и lstHolder и lstHolder2 - это пересечение.Если я правильно интерпретирую, тогда 2 шага: во-первых, переопределите Equals () в вашей структуре Holder.затем используйте оператор пересечения LINQ:

var result = lstHolder.Intersect(lstHolder2);
0 голосов
/ 16 сентября 2010

Если вы используете C # 3.0 или выше, попробуйте метод SequenceEqual

Class1._TextElements.SequenceEquals(Class1._TextElements2);

Это запустит проверку на равенство элементов в коллекции.Если последовательности имеют разную длину или какие-либо элементы в одной и той же позиции не равны, он вернет false.

0 голосов
/ 16 сентября 2010

Что вы подразумеваете под "сравнить"?Это может означать много вещей.Хотите знать, какие предметы являются общими для обоих наборов?Вы хотите знать, какие элементы отличаются?

LINQ может иметь ответ, независимо от того, что вы имеете в виду.Союз, кроме и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...