Каков наилучший способ вернуть список из списка списков базового класса на основе строки, переданной в - PullRequest
0 голосов
/ 09 марта 2011

Какой лучший способ вернуть список из списка списков базового класса на основе переданной строки. У меня есть:

public List<myBaseData> FindFromListofLists(string aClass, List<List<myBaseData>> data)
{
    foreach (var item in data)
    {
        foreach(myBaseData baseData in item)
        {
            if (baseData.ToString().CompareTo(aClass) == 0) //not sure if this is the best way as if the class overides the toString method...
            return item;
        }
    }
    return null;


}

Я уверен, что есть лучший способ сделатьэтот.Любая помощь будет оценена.

Ответы [ 5 ]

1 голос
/ 09 марта 2011

Попробуйте -

public List<myBaseData> FindFromListofLists(
      string aClass, List<List<myBaseData>> data)
{

  return data.Find(
      item => item
              .Where(d => d.ToString().CompareTo(aClass) == 0)
              .Count() > 0);

}

Вы также можете попробовать записать его как -

return data.Find(item => item.Select(x => x.ToString()).Contains(aClass));

Обратите внимание, что код не проверен: P

0 голосов
/ 09 марта 2011

Я думаю, что вы пытаетесь достичь этого.

public class MyBaseClass{}
public class MyChildClass : MyBaseClass{}

тогда в другом месте вы хотите вернуть только объекты MyChildClass. это то, что вам нужно сделать:

public IEnumerable<MyBaseClass> GetFilteredObjects(Type type, List<List<MyBaseClass>&gt lists)
{
  foreach(var list in lists)
  {
    foreach(var item in list)
    {
      if(item.GetType() == type)
        yield return item;
    }
  }
}

тогда вы вызываете этот метод так:

var myChildClasses = GetFilteredObjects(typeof(MyChildClass), listOfLists);

Надеюсь, это то, что вы ищете.

0 голосов
/ 09 марта 2011

вы можете использовать:

            if (((List<myBaseData>)item).Contains(aClass)) ;
            {
                return (item);
            }

вместо вашего второго "foreach". и это замечательная вещь в динамических списках.

0 голосов
/ 09 марта 2011

Я бы использовал Dictionary<string, List<myBaseData>> или Dictionary<Type, List<myBaseData>> вместо List<List<myBaseData>>

Метод Dictionary-s TryGet делает именно то, что вам нужно в FindFromListofLists

0 голосов
/ 09 марта 2011

Это то, что вам нужно?

Как объединить списокв C #

И затем вы можете использовать метод .Where(), чтобы сузить результаты до совпадений aClass.

...