2009-07-21 4 views
1

Я очень новичок в C# и ранее пытался игнорировать классы и строить свою небольшую программу, структурно более похожую на PHP. Достигнув дорожного блока, я пытаюсь начать и подойти к проблеме должным образом OO. Я беру длинный файл и в цикле, каждый раз, когда выполняются определенные условия, я хочу создать новый объект. Как я могу создать новый объект без указания уникального имени?C# создание объекта цикла

Referral ObjectName = new Referral(string, string, int); 

Во-вторых, как только это будет сделано, и строки & ИНТ устанавливают свои соответствующие свойства объекта, как я могу уникальный-римента класс по одному свойству, а затем отсортировать класс по другому?

Прошу прощения, если это основные вопросы, я потратил большое, большое количество времени, сначала пытаясь понять это самостоятельно с помощью google и учебника. Если только C# допускает многомерные массивы с разными типами!

Большое вам спасибо!

PS. Я хочу извлечь список уникальных объектов.

Все эти ответы, хотя и полезны, по-видимому, связаны с созданием набора тэгов IEnumerables. Нет ли способа сделать это с самим классом?

Пробуя первое решение, предоставленное Earwicker, добавляя каждый объект в список из цикла, когда я пытаюсь записать свойство элемента на консоль, я получаю ClassName + Referral. Что я могу делать неправильно? - решил. все еще необходимо .property

все еще работает. , ,

+0

Хммм, что вы подразумеваете под «unique-ify»? Вы хотите извлечь список уникальных объектов Referral? –

+0

Похоже, вам следует быстро прочитать это http://msdn.microsoft.com/en-gb/library/ybcx56wz.aspx –

ответ

6

C# позволяет использовать нетипизированные массивы. Все объекты производятся в конечном счете от object, поэтому вы используете массив или контейнер object s. Но это редко бывает необходимо. Сколько типов объекта у вас есть?

В блоке цикла вы можете создать объект точно так же, как и в этой строке кода (за исключением синтаксиса), и каждый раз, когда цикл будет создан, он будет новым объектом. Для того, чтобы сохранить все объекты, доступные вне цикла, можно добавить его в контейнер:

List<Referral> referrals = new List<Referral>(); 

// in the loop: 
Referral r = new Referral(str1, str2, num1); 
referrals.Add(r); 

Пусть Referral имеет числовое свойство Cost.

referrals.Sort((l, r) => l.Cost - r.Cost); 

Это сортирует по цене.

Для обеспечения уникальности с помощью какого-то ключа вам может быть легче выбрать более подходящий контейнер.

Dictionary<string, Referral> referrals = new List<Referral>(); 

// in the loop: 
Referral r = new Referral(str1, str2, num1); 
referrals[str1] = r; 

Это сохраняет направление в «слот» имени значения str1. Дубликаты будут перезаписывать друг друга молча.

+0

Использование lambda для Sort означает, что у вас будет поддержка LINQ, и в этом случае синтаксис OrderBy (imo) проще в использовании. – Thorarin

+0

Правда, но для больших наборов данных 'Sort' на' List' может быть немного быстрее - зависит от того, что для вас важнее. –

0

Вы не можете игнорировать классы при использовании C#. Не сопротивляйтесь изменениям!

Вам действительно не нужно создавать класс здесь? Вам действительно не нужно давать ему имя? C# позволяет свободно печатать, но безопасность типов - это хорошо.

+0

Что значит «свободная набивка»? –

+0

Вероятно, это означает, что вы используете динамическую или временную типизацию. C# имеет сильную поддержку статического (compiletime) ввода, что означает, что вы сообщаете компилятору (или он определяет) типы объектов, хранящихся в переменных, позволяя ему оптимизировать и находить множество простых ошибок. –

+0

Earwicker правильный, свободный или слабый ввод является противоположностью сильной типизации: http://en.wikipedia.org/wiki/Weak_typing – DanDan

2
List<Referral> referrals = new List<Referral>(); 

for (...) 
{ 
    referrals.Add(new Referral(string1, string2, number1)); 
} 

Затем, если вы используете Linq (который я настоятельно рекомендую), вы можете сделать это:

IEnumerable<Referral> sorted = referrals.OrderBy(x => x.string1).ThenBy(x => x.string2); 

В противном случае, вы можете использовать метод Sort() на Список < Направление >.

1

Вы можете создать объект без ссылки, но не будет иметь никакого отношения к нему позже:

new Referral(string, string, int); 

Если вы хотите, чтобы поместить их в массив/список, эти различные типы должны иметь общий базовый класс. Это называется полиморфизмом, что является очень важной концепцией программирования OO.

+1

Я бы просто хотел добавить, что вместо базового класса вы можете использовать интерфейс. Особенно важно, потому что множественное наследование не поддерживается в C#. – Thorarin

2

Во-первых, вам нужно потратить некоторое время на ознакомление с основами языка, чтобы быть продуктивным. Я рекомендую вам потратить немного времени, чтобы прочитать на C#, прежде чем заходить слишком глубоко - иначе вы потратите много времени на вращение ваших колес - или изобретаете их :)

Но вот кое-какая информация, чтобы вы начали.

Как правило, в C# вы создаете классы для представления элементов вашей программы, включая те, которые используются для представления информации (данных), которую ваша программа намеревается манипулировать. Вы действительно должны рассмотреть возможность использования одного, поскольку это сделает обработку данных более понятной и управляемой. Я бы посоветовал избегать нетипизированных многомерных массивов, как могут предположить некоторые, поскольку с ними быстро становится очень сложно работать.

Вы можете легко создать класс Referall в C# с помощью автоматических свойств и простой конструктор:

public class Referall 
{ 
    // these should be named in line with what they represent... 
    public string FirstString { get; set; } 
    public string AnotherString { get; set; } 
    public int SomeValue  { get; set; } 

    public Referall(string first, string another, int value) 
    { 
     FirstString = first; 
     AnotherString = another; 
     SomeValue = value; 
    } 
} 

Вы можете добавить их в словарь по мере их создания - словарь может быть ключом, с помощью которого когда-либо свойство уникальный. Словари позволяют хранить объекты на основе уникального ключа:

Dictionary<string,Referall> dict = new Dictionary<string,Referall>(); 

Как обрабатывать детали, вы можете добавить их в словарь:

Referall ref = new Referall(v1, v2, v3); 
// add to the dictionary, keying on FirstString... 
dict.Add(ref.FirstString, ref); 

Если вам нужно отсортировать элементы в словаре, когда вы все готово, вы можете использовать LINQ в C# 3.0:

IEnumerable<Referall> sortedResults = 
     dict.Values.OrderBy(x => x.AnotherString); 

вы можете сортировать по многократному измерению с помощью ThenBy(), а также:

IEnumerable<Referall> sortedResults = 
     dict.Values.OrderBy(x => x.AnotherString) 
        .ThenBy(x => x.SomeValue); 
0

Я не совсем понимаю, что вы пытаетесь сделать. Но, возможно, LINQ - это то, что вы ищете. Там есть тонны документации, но, как быстрый «тизер», посмотрите на 101 Linq samples on MSDN

0

C# содержит замечательную функцию, называемую «итераторными блоками». То, что вы хотите сделать, это использовать ключевое слово yield, чтобы создать Перечислимый объект вашего реферала, что-то вроде этого (не то, что я делаю формат файла и имена свойств вверх, потому что вы не разделили это):

public class Referral 
{ 
    public Guid id { get; private set; } // "uniquify" 
    public int ReferringId { get; set; } 
    public string ReferrerText { get; set; } 
    public string ReferrerDescription { get; set; } 

    private Referral() 
    { 
     id = new Guid(); 
    } 

    private Referral(string Text, string Description, int ReferringId) : this() 
    { 
     this.ReferrerText = Text; 
     this.ReferrerDescription = Description; 
     this.ReferringId = ReferringId; 
    } 

    public static IEnumerable<Referral> GetReferrals(string fileName) 
    { 
     using (var rdr = new StreamReader(fileName)) 
     { 
      var next = new Referrer(); 

      int state = 0; 
      string line; 
      while ((line = rdr.ReadLine()) != null) 
      { 
       switch (state) 
       { 
        case 0: 
         next.ReferrerText = line; 
         state = 1; 
         break; 

        case 1: 
         next.ReferrerDescription = line; 
         state = 2; 
         break; 

        case 2: 
         next.ReferringId = int.Parse(line); 
         yield return next; 
         next = new Referral(); 
         state = 0; 
         break; 
       } 
      }     
     } 
    } 
} 

Теперь вы хотите отсортировать рефералов и предположительно перечислить их для какой-либо цели.Вы можете сделать это легко:

foreach (var referral in Referral.GetReferrals(@"C:\referralfile.txt").OrderBy(r => r.Text)) 
{ 
    OutputReferral(referral); 
} 
Смежные вопросы