Как использовать свойство словаря в C # с помощью LINQ - PullRequest
1 голос
/ 11 октября 2010

Пока я юзеры и как получаю;& задавать;с простыми типами, такими как строки, теперь можно получить или установить больше свойств, таких как Dictionary , или они могут это делать?фрагмент ниже.

# User.cs
namespace LDIFMod
{
    public class User
    {

        public string UserHash { get; set; }
        public string UserID { get; set; }
        public Dictionary<string, string> UserDict { get; set; }  <- how to do this???
}

}

и в моей Program.cs

var query = from line in File.ReadAllLines(args[0])
let UserRecord = line.Split(',')
select new User()

{

 UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(),
 UserID = UserRecord[4].Trim(),
 UserDict.????   // userDict should contain key = UserRecord[5] & value = UserRecord[9]

}

Ответы [ 2 ]

4 голосов
/ 11 октября 2010

Вам нужно будет сначала инициализировать словарь в конструкторе пользовательского класса. Используйте private set, чтобы предотвратить повторную инициализацию словаря.

# User.cs
namespace LDIFMod
{
    public class User
    {
        User()
        {
            UserDict = new Dictionary<string, string>()
        }
        public string UserHash { get; set; }
        public string UserID { get; set; }
        public Dictionary<string, string> UserDict { get; private set; }
    }
}

Ваш код звонка становится

var query = from line in File.ReadAllLines(args[0])
let UserRecord = line.Split(',')
select new User()
{
     UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(),
     UserID = UserRecord[4].Trim(),
     UserDict.Add(UserRecord[5],UserRecord[9]);
}

Возвращает один словарь на строку запроса. если вы хотите, чтобы все строки разделяли словарь, вам нужно сделать его статическим или не хранить его внутри User. Если вы сделаете это, имейте в виду, что linq является отложенным выполнением, поэтому словарь не будет заполнен полностью, пока вы полностью не перечислите запрос.


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

# User.cs
namespace LDIFMod
{
    public class User
    {
        public string UserHash { get; set; }
        public string UserID { get; set; }
        public readonly string[] SourceData {get; private set;}
    }
}

и вот запрос

var query = from line in File.ReadAllLines(args[0])
let UserRecord = line.Split(',')
select new User()
{   
     UserHash = UserRecord[2].Trim() + UserRecord[3].Trim(),
     UserID = UserRecord[4].Trim(),
     SourceData = UserRecord;
}
var UserLookp = query.ToDictionary((user) => user.SourceData[5], (user) => user.SourceData[9]);

Это чисто из памяти без возможности проверки на наличие ошибок, поэтому могут быть некоторые ошибки.

1 голос
/ 11 октября 2010

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

{
    UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(),
    UserID = UserRecord[4].Trim(),
    UserDict = new Dictionary<string, string> { { UserRecord[5],  UserRecord[9] } }
}

Также см. Здесь: http://msdn.microsoft.com/en-us/library/bb531208.aspx

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