Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中的对象检索数据#_C#_Linq - Fatal编程技术网

C# 从C中的对象检索数据#

C# 从C中的对象检索数据#,c#,linq,C#,Linq,我有一个对象(大学),其中包含列表项(校园、课程、学生等) 因为我无法编写查询,例如universions.Any() 我无法编写for循环,因为对象(如universions.Count)没有扩展名Count 我可以访问每个列表项大学、学生或大学、课程等 有任何指导或建议吗?因此正确的方法是创建一个界面,以反映包含ErrorMessage属性的对象的公共性: interface IErrorMessage { string ErrorMessage { get; set; } } 然

我有一个对象(大学),其中包含列表项(校园、课程、学生等)

因为我无法编写查询,例如
universions.Any()

我无法编写for循环,因为对象(如
universions.Count)没有扩展名
Count

我可以访问每个列表项
大学、学生或
大学、课程等


有任何指导或建议吗?

因此正确的方法是创建一个界面,以反映包含
ErrorMessage属性的对象的公共性:

interface IErrorMessage {
    string ErrorMessage { get; set; }
}
然后在每个对象上实现接口:

public class Campus : IErrorMessage {
    [DataMember]
    public Guid Id { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
}
然后,您可以添加一个private helper方法和一个public方法,以将
ErrorMessage
s返回到
Universities
类:

private List<string> GetErrorMessagesFromList<T>(List<T> aList) where T : IErrorMessage {
    return aList.Where(x => !String.IsNullOrEmpty(x.ErrorMessage)).Select(x => x.ErrorMessage).ToList();
}

public List<string> GetErrorMessages() {
    return GetErrorMessagesFromList(CampusList)
            .Concat(GetErrorMessagesFromList(CourseList))
            .Concat(GetErrorMessagesFromList(StudentList))
            .ToList();
}
public List<string> GetErrorMessagesByReflection() {
    bool IsList(Type aType) => aType.IsGenericType && aType.GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));

    var errorMessages = new List<string>();

    var props = this.GetType().GetProperties()
                    .Where(p => IsList(p.PropertyType));

    foreach (var prop in props) {
        var aList = prop.GetValue(this) as IEnumerable;
        foreach (var anItem in aList) {
            var possibleErrorMessage = anItem.GetType().GetProperty("ErrorMessage").GetValue(anItem) as string;
            if (!String.IsNullOrEmpty(possibleErrorMessage))
                errorMessages.Add(possibleErrorMessage);
        }
    }

    return errorMessages;
}

因此,正确的方法是创建一个接口来反映包含
ErrorMessage
属性的对象的公共性:

interface IErrorMessage {
    string ErrorMessage { get; set; }
}
然后在每个对象上实现接口:

public class Campus : IErrorMessage {
    [DataMember]
    public Guid Id { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
}
然后,您可以添加一个private helper方法和一个public方法,以将
ErrorMessage
s返回到
Universities
类:

private List<string> GetErrorMessagesFromList<T>(List<T> aList) where T : IErrorMessage {
    return aList.Where(x => !String.IsNullOrEmpty(x.ErrorMessage)).Select(x => x.ErrorMessage).ToList();
}

public List<string> GetErrorMessages() {
    return GetErrorMessagesFromList(CampusList)
            .Concat(GetErrorMessagesFromList(CourseList))
            .Concat(GetErrorMessagesFromList(StudentList))
            .ToList();
}
public List<string> GetErrorMessagesByReflection() {
    bool IsList(Type aType) => aType.IsGenericType && aType.GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));

    var errorMessages = new List<string>();

    var props = this.GetType().GetProperties()
                    .Where(p => IsList(p.PropertyType));

    foreach (var prop in props) {
        var aList = prop.GetValue(this) as IEnumerable;
        foreach (var anItem in aList) {
            var possibleErrorMessage = anItem.GetType().GetProperty("ErrorMessage").GetValue(anItem) as string;
            if (!String.IsNullOrEmpty(possibleErrorMessage))
                errorMessages.Add(possibleErrorMessage);
        }
    }

    return errorMessages;
}

您回答了自己的问题,使用Students and Courses属性。@Crowcoder然而,我只提供了对象列表项的子集。如果对象中有30个列表项,该怎么办。我应该为每个问题写30个查询吗?例如
Univerisites.Courses.Any(x=>x.Error)
。。我相信可能有更好/更有效的处理方式。你是指30张清单还是一张清单中的30项?请编辑您的问题,使其更准确地传达您正在尝试做的事情。因此,您需要类似于
大学的东西。SelectMany(u=>u.CourseList)。SelectMany(c=>c.Errors)
?如果这是一项作业,我猜您应该实现一个接口,因为它迫切需要它。您回答了自己的问题,使用Students和Courses属性。@Crowcoder但是,我只提供了对象列表项的子集。如果对象中有30个列表项,该怎么办。我应该为每个问题写30个查询吗?例如
Univerisites.Courses.Any(x=>x.Error)
。。我相信可能有更好/更有效的处理方式。你是指30张清单还是一张清单中的30项?请编辑您的问题,以便它能更准确地传达您的意图。因此,您需要类似于
大学的东西。SelectMany(u=>u.CourseList)。SelectMany(c=>c.Errors)
?如果这是一项作业,我猜您应该实现一个接口,因为它迫切需要它。