Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > отсортировать массив


Автор: lamber 22.4.2011, 11:25
Есть структура вида
Код

struct edge
{
public string _out;
public string _in;
}


есть массив этих структур (пар), нужно из них получить массив упорядоченных элементов таким образом чтобы связанные элементы шли от первого элемента к последнему. Предполагаем что в данной структуре нет петель, первый элемент не имеет входящих элементов, а последний исходящих. думаю лучше пояснить на примере.
a-b
a-c
c-e
b-e
e-d

вот у нас дан массив из него нужно сформировать массив элементов вида {a,b,c,e,d} либо {a,c,b,e,d} вот не знаю как решить подобную задачу.

Автор: mihryak 22.4.2011, 14:16
Код

    class Test
    {
        public Test(string inValue, string outValue)
        {
            In = inValue;
            Out = outValue;
        }

        public string In { get; set; }
        public string Out { get; set; }

        public override string ToString()
        {
            return string.Format("{0}:{1}", In, Out);
        }
    }

    class Program
    {
        static List<List<Test>> GetSequences(List<Test> tests)
        {
            List<List<Test>> sequences = new List<List<Test>>();
            var rootElements = tests.Where(t => t.In == tests[0].In);
            foreach (var root in rootElements)
            {
                List<Test> sequence = new List<Test> {root};
                sequences.Add(sequence);
                FindDescendants(sequences, sequence, tests);
            }

            return sequences;
        }

        static void FindDescendants(List<List<Test>> sequences, List<Test> currentSequence,
            List<Test> testRepository)
        {
            bool createNewSecuence = false;
            Test lastItem = currentSequence.Last();
            List<Test> savedCurrentSequence = new List<Test>(currentSequence);
            foreach (Test descendant in testRepository.Where(t => t.In == lastItem.Out))
            {
                List<Test> sequence;
                if (createNewSecuence)
                {
                    sequence = new List<Test>(savedCurrentSequence);
                    sequences.Add(sequence);
                }
                else
                {
                    sequence = currentSequence;
                }
                sequence.Add(descendant);
                FindDescendants(sequences, sequence, testRepository);
                createNewSecuence = true;
            }            
        }

        static void Main(string[] args)
        {
            List<Test> tests = new List<Test>
                {
                    new Test("a", "b"),
                    new Test("a", "c"),
                    new Test("c", "e"),
                    new Test("b", "e"),
                    new Test("b", "d"),
                    new Test("e", "d")
                };

            var sequences = GetSequences(tests);

            foreach (List<Test> sequence in sequences)
            {
                Console.WriteLine(string.Join(" => ", sequence.Select(t => t.ToString()).ToArray()));
            }
            Console.ReadKey();
        }
    }

Автор: A5uKa 22.4.2011, 14:56
Код

return table.AsEnumerble().GroupBy(x=> x._out).SortBy(x=> x._out);


не ?

Автор: mihryak 22.4.2011, 15:38
Цитата(A5uKa @  22.4.2011,  15:56 Найти цитируемый пост)
не ?

не.

Автор: A5uKa 22.4.2011, 15:43
Цитата(mihryak @ 22.4.2011,  15:38)
Цитата(A5uKa @  22.4.2011,  15:56 Найти цитируемый пост)
не ?

не.

почему ?

Автор: mihryak 22.4.2011, 19:07
потому что результат будет не тот
совсем не тот

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)