所以我有这个模型设置
public class ListOfThings
{
public int Id {get;set;}
public List<int> DefaultRanks {get;set;}
static public IEnumerable<ListOfThings> ListOfDefault{
get {
listOfDefault = new List<ListOfDefault>();
listOfDefault.Add(N1);
listOfDefault.Add(N2);
listOfDefault.Add(N3);
return listOfDefault.AsReadOnly();
}
}
static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } }
static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } }
static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } }
static private ListOfThings n1;
static private ListOfThings n2;
static private ListOfThings n3;
static private List<ListOfThings> listOfDefault;
}
每当我试图查询静态Ienumerable时,它都会给我一个null值。
var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
如果我尝试这样做,它会给我一个演员警告。
ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
如有任何建议,不胜感激。。
谢谢!!-G
不清楚你所说的"它会给我一个null值"是什么意思——我对你给出的代码表示异议。(一个简短但完整的演示问题的程序将非常有帮助。)
第二行肯定会给出编译时失败,理由是Where
返回的是IEnumerable<ListOfThings>
,而不是单个ListOfThings
。你可能想要这样的东西:
ListOfThings test = ListOfThings.ListOfDefault.SingleOrDefault(a => a.Id == 2);
请注意,您从未在给定的代码中初始化或使用n1
、n2
或n3
。我还建议使用迭代器块来简化ListOfDefault属性:
static public IEnumerable<ListOfThings> ListOfDefault {
get {
yield return N1;
yield return N2;
yield return N3;
}
}
您的代码中存在一些问题。我所做的改变是:
// in a getter
listOfDefault = new List<ListOfDefault>();
// should be:
listOfDefault = new List<ListOfThings>();
// static getters
static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } }
static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } }
static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } }
// should be:
static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } }
static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } }
static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } }
最重要的是不要在LINQ上调用FirstOrDefault()(如果你想获得更多的对象,请使用ToList()):
var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault();
这样它就应该起作用。
我试图重新创建这个问题,但几乎没有问题。我已经在下面粘贴了代码
public class ListOfThings
{
public int Id { get; set; }
public List<int> DefaultRanks { get; set; }
static public IEnumerable<ListOfThings> ListOfDefault
{
get
{
listOfDefault = new List<ListOfThings>();
listOfDefault.Add(N1);
listOfDefault.Add(N2);
listOfDefault.Add(N3);
return listOfDefault.AsReadOnly();
}
}
static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } }
static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } }
static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } }
static private ListOfThings n1;
static private ListOfThings n2;
static private ListOfThings n3;
static private List<ListOfThings> listOfDefault;
}
class Program
{
static void Main(string[] args)
{
var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
IEnumerable<ListOfThings> ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
}
}
ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
正在返回Ienumerable而不是单个对象如果您希望单个对象或第一个对象执行类似的操作
ListOfThings ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault();