繁体   English   中英

从对象列表中获取唯一的对象

[英]Get unique objects From List of Objects

我有这样的类对象:

    public class SD
    {
        public string s { get; set; }
    }

    public class Obj
    {
        public string p { get; set; }
        public string u { get; set; }
        public List<SD> sD { get; set; }
    }

    public class ObjAssignStudy
    {
        public List<Obj> obj { get; set; }
    }

我以这种方式获取数据:

{
  "obj":[
    {"p":"1","usertype":"A","studyData":[{"study":"1"},{"study":"2"}]},
    {"p":"2","usertype":"A","studyData":[{"study":"1"}]}
    {"p":"1","usertype":"A","studyData":[{"study":"2"},{"study":"3"}]}
  ]
}

我想要的是,我想获得不同的P并向其附加coresponding s。 我希望最终对象包含这样的数据:

{
  "obj":[
    {"p":"1","usertype":"A","studyData":[{"study":"1"},{"study":"2"},{"study":"3"}]},
    {"p":"2","usertype":"A","studyData":[{"study":"1"}]}
  ]
}

我可以通过任何方式在C#或linq中实现此目标?

var objs = new List<Obj>(){
    new Obj 
    { 
        p = "1",
        u = "A",
        sD = new List<SD>() {new SD() { s = "1"}, new SD() { s = "2"}}
    },
    new Obj 
    { 
        p = "2",
        u = "A",
        sD = new List<SD>() {new SD() { s = "1"}}
    },
    new Obj 
    { 
        p = "1",
        u = "A",
        sD = new List<SD>() {new SD() { s = "2"}, new SD() { s = "3"}}
    }
};

var distinct = from obj in objs
               group obj by new { obj.p } into g
               select new Obj {
                   p = g.Key.p,
                   u = g.First().u, 
                   sD = g.SelectMany(i => i.sD).Distinct().ToList() 
               };

修改SD类以使用Distinct

public class SD
{
    public string s { get; set; }

    public override bool Equals(object obj)
    {
        return string.Equals(s, (obj as SD).s);
    } 

    public override int GetHashCode()
    {
        return s.GetHashCode();
    }
}

在这种特殊情况下,您可以使用索引器获取与要传递给object的值相对应的特定List<SD> ,请仔细阅读将详细说明该代码的代码;

创建Indexer

public List<SD> this[string index]
{
   get
     {
       foreach (Obj item in ListObj)
        {
          if (item.p == index)
          return item.sD;
        }
        return new List<SD>();
     }              
 }

在主要功能中,您可以访问索引器并存储收集详细信息,如下所示:

    static void Main(string[] args)
    {
        ObjAssignStudy newInstance = new ObjAssignStudy();
        List<SD> sampleData=newInstance["b"];// Gives the output
       //collection as : EmptyList1,EmptyList2
    }

完整的代码供您参考:

 class Program
    {
        static void Main(string[] args)
        {
            ObjAssignStudy newInstance = new ObjAssignStudy();
         List<SD> sampleData=newInstance["c"];
        }
        public class SD
        {
            public string s { get; set; }
        }

        public class Obj
        {
            public string p { get; set; }
            public string u { get; set; }
            public List<SD> sD { get; set; }
        }

        public class ObjAssignStudy
        {

            private List<Obj> _ListObj= new List<Obj>();
            internal List<Obj> ListObj
            {
                get { return _ListObj; }
                set { _ListObj = value; }
            }
            List<SD> tempList = new List<SD>(); 
            public ObjAssignStudy()
            {
                tempList.Add(new SD() { s = "EmptyList1" });
                ListObj.Add(new Obj() { p = "a", sD = tempList, u = "B" });
                tempList.Add(new SD() { s = "EmptyList2" });
                ListObj.Add(new Obj() { p = "b", sD =tempList, u = "C" });
                tempList.Add(new SD() { s = "EmptyList3" });
                ListObj.Add(new Obj() { p = "c", sD =tempList, u = "D" });               
            }
            public List<SD> this[string index]
            {
                get
                {
                    foreach (Obj item in ListObj)
                    {
                        if (item.p == index)
                            return item.sD;
                    }
                    return new List<SD>();
                }              
            }
        }
    }

测试用例:列表sampleData = newInstance [“ a”]; //给出输出

EmptyList1

 List<SD> sampleData=newInstance["a"];// Gives the output

空清单1空清单2

 List<SD> sampleData=newInstance["a"];// Gives the output

EmptyList1EmptyList2EmptyList3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM