как я могу получить элемент списка подгруппы через список группы - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно выбрать элементы в списке 1, если список элементов подгруппы содержит объект подгруппы, соответствующий имени группы одной из подгрупп в списке 2.Это возможно?

List<RootObject> list2= (List<RootObject>)ViewState["GroupName"];
          List<SubGroup> list1 = new List<SubGroup>();

var result = list1.Where(p => list2.Any(l => p.lblGrpName.Any(c => c.GrpName== l.SubGroup)));

классы

  [Serializable()]
  public class SubGroup
  {
      public int SubGroupCode { get; set; }
      public string SubGroupName { get; set; }
      public string Item { get; set; }
      public List<Item> Items { get; set; }
  }

  [Serializable()]
  public class RootObject
  {
      public int Code { get; set; }
      public string GrpName { get; set; }
      public string GrpImgUrl { get; set; }
      public List<SubGroup> SubGroup { get; set; }

  }

Я хочу следующий вывод в моем пользовательском интерфейсе.

enter image description here enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

Попробуйте:

//"transform" list2 into a fast searchable hashSet
var subGroupNames = list2.SelectMany(x => x.SubGroup.Select(y => y.SubGroupName)).ToHashSet(); 

//check if list1 has an entry in the hashSet
var result = list1.Where(x => subGroupNames.Contains(x.SubGroupName));

ToHashSet - это метод расширения MoreLinq

Если вы не хотите использовать этот пакет NuGet, вы можете переписать первое утверждение как

var subGroupNames = new HashSet<string>(list2.SelectMany(x => x.SubGroup.Select(y => y.SubGroupName))); 

с указанным кодом:

public string getSubGroupData()
{
    try
    {
        //Label lblGrpName = (Label)rptGroupName.FindControl("lblGrpName");
        lblGrpName.Text = "GrpName";
        var groupname = lblGrpName.Text;
        var v = ViewState["GroupName"];
        List<RootObject> list2 = (List<RootObject>)ViewState["GroupName"];
        List<SubGroup> list1 = new List<SubGroup>();
        var subGroupNames = new HashSet<string>(list2.SelectMany(x => x.SubGroup.Select(y => y.SubGroupName)));
        var result = list1.Where(x => subGroupNames.Contains(x.SubGroupName));
        Repeater2.DataSource = list2;
        Repeater2.DataBind();
    }
}

Попробуйте изменить его следующим образом:

public string getSubGroupData()
{
    try
    {
        var groupname = lblGrpName.Text;

        List<RootObject> rootObjects = (List<RootObject>)ViewState["GroupName"];

        //get the rootObjects with the GrpName of lblGrpName.Text
        var filteredRootObjects = rootObjects.Where(x => x.GrpName == groupname);

        //get the subGroup objects of the filteredRootObjects
        var subGroups = filteredRootObjects.SelectMany(x => x.SubGroup);

        //pass the subGroups to your DataSource
        Repeater2.DataSource = subGroups;
        Repeater2.DataBind();
    }
}

Если GrpName является уникальным в List<RootObject>, вы также можете сделать это:

public string getSubGroupData()
{
    try
    {
        var groupname = lblGrpName.Text;

        List<RootObject> rootObjects = (List<RootObject>)ViewState["GroupName"];

        //get the first entry in rootObjects with the GrpName of lblGrpName.Text
        var rootObject = rootObjects.First(x => x.GrpName == groupname);

        //pass the List<SubGroup> member SubGroup of the found RootObject
        Repeater2.DataSource = rootObject.SubGroup;
        Repeater2.DataBind();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...