1 / 1 / 0
Регистрация: 24.11.2015
Сообщений: 45
1

Вызов OrderBy

17.04.2018, 11:24. Показов 641. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро, всем форумчанам!! Есть класс на C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    class HuffmanTree
    {
        private List<Node> nodes = new List<Node>();
        public Node Root { get; set; }
        public Dictionary<char, int> Frequencies = new Dictionary<char, int>();
 
        public void Build(string source)
        {
            for (int i = 0; i < source.Length; i++)
            {
                if (!Frequencies.ContainsKey(source[i]))
                {
                    Frequencies.Add(source[i], 0);
                }
 
                Frequencies[source[i]]++;
            }
 
            foreach (KeyValuePair<char, int> symbol in Frequencies)
            {
                nodes.Add(new Node() { Symbol = symbol.Key, Frequency = symbol.Value });
            }
 
            while (nodes.Count > 1)
            {
                List<Node> orderedNodes = nodes.OrderBy(node => node.Frequency).ToList<Node>();
 
                if (orderedNodes.Count >= 2)
                {
                    // Take first two items
                    List<Node> taken = orderedNodes.Take(2).ToList<Node>();
 
                    // Create a parent node by combining the frequencies
                    Node parent = new Node()
                    {
                        Symbol = '*',
                        Frequency = taken[0].Frequency + taken[1].Frequency,
                        Left = taken[0],
                        Right = taken[1]
                    };
 
                    nodes.Remove(taken[0]);
                    nodes.Remove(taken[1]);
                    nodes.Add(parent);
                }
 
                this.Root = nodes.FirstOrDefault();
 
            }
 
        }
 
        public BitArray Encode(string source)
        {
            List<bool> encodedSource = new List<bool>();
 
            for (int i = 0; i < source.Length; i++)
            {
                List<bool> encodedSymbol = this.Root.Traverse(source[i], new List<bool>());
                encodedSource.AddRange(encodedSymbol);
            }
 
            BitArray bits = new BitArray(encodedSource.ToArray());
 
            return bits;
        }
 
        public string Decode(BitArray bits)
        {
            Node current = this.Root;
            string decoded = "";
 
            foreach (bool bit in bits)
            {
                if (bit)
                {
                    if (current.Right != null)
                    {
                        current = current.Right;
                    }
                }
                else
                {
                    if (current.Left != null)
                    {
                        current = current.Left;
                    }
                }
 
                if (IsLeaf(current))
                {
                    decoded += current.Symbol;
                    current = this.Root;
                }
            }
 
            return decoded;
        }
 
        public bool IsLeaf(Node node)
        {
            return (node.Left == null && node.Right == null);
        }
    }
Я перевел его на C++/CLI
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using namespace System;
 
 private ref class HuffmanTree
 {
    private:
        List<Node^> ^nodes = gcnew List<Node^>();
    public:
        property Node ^Root;
        Dictionary<Char, int> ^Frequencies = gcnew Dictionary<Char, int>();
 
        void Build(String ^source)
        {
            for (int i = 0; i < source->Length; i++)
            {
                if (!Frequencies->ContainsKey(source[i]))
                {
                    Frequencies->Add(source[i], 0);
                }
 
                Frequencies[source[i]]++;
            }
 
            for each (KeyValuePair<Char, int> ^symbol in Frequencies)
            {
                Node ^tempVar = gcnew Node();
                tempVar->Symbol = symbol.Key;
                tempVar->Frequency = symbol.Value;
                nodes->Add(tempVar);
            }
 
            while (nodes->Count > 1)
            {
                List<Node^> ^orderedNodes = nodes->OrderBy(AnonymousMethod1)->ToList<Node^>();
 
                if (orderedNodes->Count >= 2)
                {
                    // Take first two items
                    List<Node^> ^taken = orderedNodes->Take(2)->ToList<Node^>();
 
                    // Create a parent node by combining the frequencies
                    Node ^parent = gcnew Node();
                    parent->Symbol = '*';
                    parent->Frequency = taken[0]->Frequency + taken[1]->Frequency;
                    parent->Left = taken[0];
                    parent->Right = taken[1];
 
                    nodes->Remove(taken[0]);
                    nodes->Remove(taken[1]);
                    nodes->Add(parent);
                }
 
                this->Root = nodes->FirstOrDefault();
 
            }
 
        }
        
    private:
        void AnonymousMethod1(Object ^node)
        {
            node->Frequency;
        }
 
    public:
        BitArray ^Encode(String ^source)
        {
            List<bool> ^encodedSource = gcnew List<bool>();
 
            for (int i = 0; i < source->Length; i++)
            {
                List<bool> ^encodedSymbol = this->Root->Traverse(source[i], gcnew List<bool>());
                encodedSource->AddRange(encodedSymbol);
            }
 
            BitArray ^bits = gcnew BitArray(encodedSource->ToArray());
 
            return bits;
        }
 
        String ^Decode(BitArray ^bits)
        {
            Node ^current = this->Root;
            String ^decoded = "";
 
            for each (bool bit in bits)
            {
                if (bit)
                {
                    if (current->Right != nullptr)
                    {
                        current = current->Right;
                    }
                }
                else
                {
                    if (current->Left != nullptr)
                    {
                        current = current->Left;
                    }
                }
 
                if (IsLeaf(current))
                {
                    decoded += current->Symbol;
                    current = this->Root;
                }
            }
 
            return decoded;
        }
 
        bool IsLeaf(Node ^node)
        {
            return (node->Left == nullptr && node->Right == nullptr);
        }
 };
Но появляется ошибка в OrderBy, помогите пожалуйста правильно перевести код..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2018, 11:24
Ответы с готовыми решениями:

Не работает Me.OrderBy
Ситуация такая: Сделал ленточную форму, на некоторые элементы которой повесил на клик...

Как работает OrderBy
функция класса public Товары SortByCena() { return a.OrderBy(q =&gt;...

Двойная сортировка OrderBy
Ребят подскажите пожалуйста как сортировать данные по двум критериям с помощью OrderBy. Просто в...

OrderBy по значению строки
На вход подается массив обьектов, у которых имеется строковое поле(propString). Нужно...

2
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,268
Записей в блоге: 1
01.05.2018, 23:26 2
Gersona2015, наверное уже не актуально, но тем не менее
C++
1
2
3
4
5
6
List<Node^> ^orderedNodes = Enumerable::ToList<Node^>(Enumerable::OrderBy(nodes, gcnew Func<Node^, int>(AnonymousMethod1)));
...
    static int AnonymousMethod1(Node ^node)
    {
        return node->Frequency;
    }
Весь код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "stdafx.h"
 
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;
using namespace System::Linq;
 
private ref class HuffmanTree
{
private:
    List<Node^> ^nodes = gcnew List<Node^>();
public:
    property Node ^Root;
    Dictionary<Char, int> ^Frequencies = gcnew Dictionary<Char, int>();
 
    void Build(String ^source)
    {
        for (int i = 0; i < source->Length; i++)
        {
            if (!Frequencies->ContainsKey(source[i]))
            {
                Frequencies->Add(source[i], 0);
            }
 
            Frequencies[source[i]]++;
        }
 
        for each (KeyValuePair<Char, int> ^symbol in Frequencies)
        {
            Node ^tempVar = gcnew Node();
            tempVar->Symbol = symbol->Key;
            tempVar->Frequency = symbol->Value;
            nodes->Add(tempVar);
        }
 
        while (nodes->Count > 1)
        {
            List<Node^> ^orderedNodes = Enumerable::ToList<Node^>(Enumerable::OrderBy(nodes, gcnew Func<Node^, int>(AnonymousMethod1)));
 
            if (orderedNodes->Count >= 2)
            {
                // Take first two items
                List<Node^> ^taken = Enumerable::ToList<Node^>(Enumerable::Take(orderedNodes, 2));
 
                // Create a parent node by combining the frequencies
                Node ^parent = gcnew Node();
                parent->Symbol = '*';
                parent->Frequency = taken[0]->Frequency + taken[1]->Frequency;
                parent->Left = taken[0];
                parent->Right = taken[1];
 
                nodes->Remove(taken[0]);
                nodes->Remove(taken[1]);
                nodes->Add(parent);
            }
 
            this->Root = Enumerable::FirstOrDefault(nodes);
 
        }
 
    }
 
private:
    static int AnonymousMethod1(Node ^node)
    {
        return node->Frequency;
    }
 
public:
    BitArray ^ Encode(String ^source)
    {
        List<bool> ^encodedSource = gcnew List<bool>();
 
        for (int i = 0; i < source->Length; i++)
        {
            List<bool> ^encodedSymbol = this->Root->Traverse(source[i], gcnew List<bool>());
            encodedSource->AddRange(encodedSymbol);
        }
 
        BitArray ^bits = gcnew BitArray(encodedSource->ToArray());
 
        return bits;
    }
 
    String ^Decode(BitArray ^bits)
    {
        Node ^current = this->Root;
        String ^decoded = "";
 
        for each (bool bit in bits)
        {
            if (bit)
            {
                if (current->Right != nullptr)
                {
                    current = current->Right;
                }
            }
            else
            {
                if (current->Left != nullptr)
                {
                    current = current->Left;
                }
            }
 
            if (IsLeaf(current))
            {
                decoded += current->Symbol;
                current = this->Root;
            }
        }
 
        return decoded;
    }
 
    bool IsLeaf(Node ^node)
    {
        return (node->Left == nullptr && node->Right == nullptr);
    }
};
1
1 / 1 / 0
Регистрация: 24.11.2015
Сообщений: 45
01.05.2018, 23:34  [ТС] 3
Большое Вам спасибо, попробую вашу поправку! как раз я ждал ответ на вопрос
0
01.05.2018, 23:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2018, 23:34
Помогаю со студенческими работами здесь

Как использовать me.orderby ???
Как использовать me.orderby ??? при попытке выполнить me.orderby 'ПОЛЕ СОРТИРОВКИ' возникает...

OrderBy() и иже с ним
есть такой код static List&lt;string&gt; strout = new List&lt;string&gt;(); StreamWriter writer = new...

Сортировка массива используя OrderBy
Можно-ли с помощью OrderBy сортировать массив так 1) все четный эллементы по возрастанию 2) все...

Orderby сортировка по дате и по алфавиту
Не сортируются вообще нечего можете поправить что не так пожалуйста view- @using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru