Можно ли выполнить Linq, чтобы вернуть коллекцию как HashSet вместо List? - PullRequest
2 голосов
/ 22 июля 2011

Я использую следующий Linq-to-XML для загрузки некоторых структур XML в мои структуры данных.

    // Load all the definitions
var definitions = doc.Descendants(Constants.ScriptNode)
                     .Select(x => new TcScriptDefinition
                     {
                         Application = x.Attribute(Constants.AppAttribute).Value,
                         CaseName = x.Attribute(Constants.CaseAttribute).Value,
                         ActionType = x.Attribute(Constants.ActionAttribute).Value,
                         ScriptUnit = x.Attribute(Constants.UnitAttribute).Value,
                         ScriptMethod = x.Attribute(Constants.MethodAttribute).Value,
                         Parameters = x.Descendants(Constants.ParamNode)
                                       .Select(param => new TcScriptParameter
                                       {
                                           Code = param.Attribute(Constants.ParamCodeAttribute).Value,
                                           ParameterNumber = Convert.ToInt32(param.Attribute(Constants.ParamOrderAttribute).Value),
                                           DisplayString = param.Attribute(Constants.ParamDisplayAttribute).Value
                                       })
                                       .ToList()
                     })
                     .ToList();

Проблема в том, что TcScriptDefinition.Parameters определен как HashSet<TcScriptParameter> и, следовательно, ToList() не может скомпилироваться, поскольку возвращает List<T>.

Как я могу загрузить свой xml в HashSet<T> через Linq?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

В качестве альтернативы созданию метода расширения для ToHashSet, вы также можете просто создать HashSet<T> на лету, изменив соответствующий раздел на:

Parameters = new HashSet<DecendantType>(x.Descendants(Constants.ParamNode)
                                   .Select(param => new TcScriptParameter
                                   {
                                       Code = param.Attribute(Constants.ParamCodeAttribute).Value,
                                       ParameterNumber = Convert.ToInt32(param.Attribute(Constants.ParamOrderAttribute).Value),
                                       DisplayString = param.Attribute(Constants.ParamDisplayAttribute).Value
                                   }))
2 голосов
/ 22 июля 2011

В LINQ to Objects нет ToHashSet<> метода расширения, но его легко написать:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
    // TODO: Argument validation here...
    return new HashSet<T>(source);
}

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

Мне бы очень хотелось увидеть это в фреймворке - это удобный маленький дополнительный оператор.

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