2015-11-27 2 views
0

Я пытаюсь создать симулятор ATM в C# и я вроде застрял с бревном в Я использую класс с именем пользователя, который я определил следующим образом:.Как создать двумерный массив, содержащий Ints и Strings в C#?

public class User 
    { 
     public string userName { get; set; } 
     public string password { get; set; } 
     public int savingsAcct { get; set; } 
     public int checkAcct { get; set; } 
    } 

Я создал три экземпляра моего класса для представления трех учетных записей, которые я буду использовать. Поэтому мне было интересно, как я могу создать двумерный массив, который будет принимать как строки, так и ints.

Я думаю, что я могу использовать двумерный массив для журнала, потому что я могу использовать цикл for для перемещения по массиву и проверять имя пользователя и пароль каждой учетной записи, чтобы увидеть, соответствуют ли они. Я знаю, что могу использовать базу данных или что-то еще, но я все еще относительно новичок в C#, поэтому я не ищу что-то эффективное, я просто ищу что-то, что работает. Любая помощь приветствуется.

+0

Вы можете сделать: 'класс MyClass {общественный струнной myStringProperty {get; задавать; } public int myIntProperty {get; задавать; }} ', а затем' myClass [,] my2dArrayStringAndInt; ' – varocarbas

+0

Что вы подразумеваете под этим? Извините за вопрос, но я все еще немного новичок в C#, и я просмотрел некоторые уроки и создал несколько простых проектов, но сейчас я пытаюсь узнать немного больше, поэтому все это мне кажется немного сложнее. – Sebastian

+0

Я имею в виду, что 2D-массив в C# является 'nametype [,]' (где 'nametype' является' string' или 'int' или' double'). Вы также можете использовать 'class' для определения этого' nametype'. То есть вы определяете массив (или список, или словарь или любую другую коллекцию) из-за класса, который вы создаете. Этот класс может иметь 2 свойства и переменную 'int' и переменную' string'; сделайте массив из него, и там у вас есть это: и массив со значениями строки и int. – varocarbas

ответ

0

Как вы хотите сохранить ваши User объекты, а затем сохранить их в этом формате, а не пытаться втиснуть их дискомфортно в какую-то комбинацию string/int.Так что давайте Сии у вас есть 3 пользовательские объекты:

var bob = new User { userName = "Bob" }; 
var alice = new User { userName = "Alice" }; 
var marvin = new User { userName = "Marvin" }; 

Давайте соберем их в List<>:

var users = new List<User> { bob, alice, marvin }; 

И теперь вы можете петлю вокруг него, как вы хотите:

foreach(var user in users) 
{ 
    Console.WriteLine(user.userName); 
} 

И если вы хотели бы найти конкретный предмет, вы можете быстро его получить:

var user = users.SingleOrDefault(u => u.userName = "Bob"); 
if (user != null) 
{ 
    //We found a user called Bob 
} 

Или даже проверить специально для имени пользователя и пароля:

var userIsValid = users.Any(u => u.userName = "Bob" && u.password = "secret"); 
+0

Это очень полезно и просто. Благодарю. Теперь мне просто нужно адаптировать его, чтобы он работал с Windows Forms. – Sebastian

-1

В C# Вы не можете создать двухмерный массив с двумя разными типами данных, в вашем случае, int и string. Вы можете создать только двумерный массив одного и того же типа данных.

Если вам нужна структура данных для хранения двух типов данных, вы можете использовать пары словаря.

//e.g. 
Dictionary<int, string> data = new Dictionary<int, string> 
{ 
    {1, "value 1"}, 
    {2, "value 2"}, 
    {3, "value 3"} 
}; 


//With your POCO can create a Dictionary as below 
Dictionary<int, User> data = new Dictionary<int, User> 
{ 
    {1, new User{ userName = "username1", password = "password1", savingsAcct = 1,checkAcct = 1 }}, 
    {2, new User{ userName = "username2", password = "password2", savingsAcct = 1,checkAcct = 2 }}, 
    {3, new User{ userName = "username3", password = "password3", savingsAcct = 1,checkAcct = 3}} 
}; 

Вы можете использовать цикл для инициализации словаря

0

Как пояснил в комментариях, вы ищете коллекцию, которая может хранить User объектов в приложении.

Если вам нужно изменить содержимое коллекции, то List<T> - хороший выбор - он не имеет фиксированного размера, поэтому его легко добавлять и удалять.

List<User> _allUsers = new List<User>(); 
_allUsers.Add(/* user object */); //populate the list with Users using .Add() 

foreach (var user in _allUsers) 
{ 
    if(user.userName == someInputVariable && user.passWord == someOtherInputVariable) 
    { 
     ... 
    } 
} 

MSDN documentation for List<T>

Вы также можете использовать 1-мерный массив User, но я думаю, что List<T> имеет смысл для того, что вы пытаетесь сделать, и это очень легко работать, как кто-то только начинает изучать язык.

1

Это показывает рабочий пример, но нужно будет массировать в код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class User 
    { 
     public string userName { get; set; } 
     public string password { get; set; } 
     public int savingsAcct { get; set; } 
     public int checkAcct { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // here you'll take the user and password from the form 
      string userNameEnteredIntoScreen = "???"; 
      string passwordEnteredIntoScreen = "???"; 

      // build list of valid users (amend to suit) 
      var users = new List<User>(); 
      users.Add(new User 
      { 
       userName = "user1", 
       password = "abc", 
       savingsAcct = 1, 
       checkAcct = 2, 
      }); 
      users.Add(new User 
      { 
       userName = "user2", 
       password = "xyz", 
       savingsAcct = 3, 
       checkAcct = 4, 
      }); 

      // then to check if they're valid 
      var user = users.SingleOrDefault(u => 
       u.userName == userNameEnteredIntoScreen && 
       u.password == passwordEnteredIntoScreen 
       ); 

      if (user != null) 
      { 
       // the user and password was valid, and 'user' variable 
       // now contains the details of the user 
      } 
     } 
    } 
} 
2

Вы действительно должны изучить некоторые основы работы с базами данных. Ваш класс User - это то, что называется Model и что вы ищете - это коллекция.

Прежде всего я бы рекомендовал добавить id поле, чтобы сделать его легче идентифицировать каждый объект (хотя это необязательно):

public class User 
{ 
    public int id { get; set; } 
    public string userName { get; set; } 
    public string password { get; set; } 
    public int savingsAcct { get; set; } 
    public int checkAcct { get; set; } 
} 

И вы можете использовать List<User>:

List<User> users = new List<User>() 
{ 
    new User() { id = 0, userName = "Alex", etc... } 
    new User() { id = 1, userName = "Joshua", etc... } 
    new User() { id = 2, userName = "Phil", etc... } 
}; 

К найти пользователя с определенным именем пользователя, вы должны использовать LINQ здесь:

//    returns null if no such user is found 
User alex = users.FirstOrDefault(u => u.userName == "Alex"); 

Иногда это больше подходит для использования Dictionary<TKey, TValue> чем List<T>:

Dictionary<string, User> users = new Dictionary<string, User>() 
{ 
    { "Alex", new User() { id = 0, userName = "Alex", etc... } }, 
    { "Joshua", new User() { id = 1, userName = "Joshua", etc... } }, 
    { "Phil", new User() { id = 2, userName = "Phil", etc... } }, 
}; 

Затем вы можете получить доступ пользователей по имени пользователя с помощью индексатора:

User alex = users["Alex"]; 
Смежные вопросы