我有以下场景,希望得到一些关于此主题的帮助指导:
对于一个简单的聊天应用程序,我有一个由用户凭据组成的xml文件(不用于商业用途,因此在这种情况下,安全性真的没有任何意义)。如果用户订阅了服务,则其凭据应与XML文件中记录的凭据匹配。
XML文件的代码段:
<Users>
<User>
<Username>Johan</Username>
<Password>Johan123</Password>
</User>
<User>
<Username>Carel</Username>
<Password>Carel123</Password>
</User>
...
...
</Users>
然后我有以下课程:
public class Credentials
{
public string Username { get; set; }
public string Password { get; set; }
}
credentials类仅用于检索记录在xml文件中的用户列表,以及检索特定用户。
我有以下代码可以从XML文件中检索元素:
public List<Credentials> RetrieveUsers()
{
Root = XElement.Load(path + "Users.xml");
List<Credentials> credentials = new List<Credentials>();
var xmlResults = from element in Root.Elements().Elements()
select new
{
Username = element.Element("Username").Value,
Password = element.Element("Password").Value
};
foreach(var xmlResult in xmlResults)
{
Credentials temp = new Credentials();
temp.Username = xmlResult.Username;
temp.Password = xmlResult.Password;
credentials.Add(temp);
}
return credentials;
}
然而,这感觉是多余的。我想实现以下目标(这不起作用):
public List<Credentials> RetrieveUsers()
{
Root = XElement.Load(path + "Users.xml");
List<Credentials> credentials = new List<Credentials>();
List<Credentials> xmlResults = from element in Root.Elements().Elements()
select new
{
Username = element.Element("Username").Value,
Password = element.Element("Password").Value
};
return xmlResults;
}
它给了我以下错误:
“无法将类型”System.Collections.Generic.IEnumerable“隐式转换为”System.Collections.Generic.List“。”存在显式转换(是否缺少转换?)
这非常有意义,正如我想象的那样,它使用IEnumerable来枚举select LINQ语句所生成的集合。
如果我从错误的角度来看待这个问题,如果我可以用另一种方法来代替,请告诉我。提前谢谢
最佳答案
您只需要调用ToList
扩展方法来创建一个列表。此外,您需要创建Credentials
对象,而不是匿名类型的实例。例如:
var xmlResults = from element in Root.Elements().Elements()
select new Credentials
{
Username = element.Element("Username").Value,
Password = element.Element("Password").Value
};
return xmlResults.ToList();
就我个人而言,我不倾向于使用查询表达式来进行简单的from/select查询—我会写下:
return Root.Elements().Elements() // TODO: Consider specifying the element name
.Select(element => new Credentials
{
Username = element.Element("Username").Value,
Password = element.Element("Password").Value
})
.ToList();
使用这样的“点表示法”的好处是,调用
ToList
不会在括号中留下一个查询表达式,这看起来总是有点难看。关于c# - 访问和保存对象集合中的XElement,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19715572/