LINQ для запроса DTO для конкретной пары имя-значение в общем и рекурсивном режиме - PullRequest
2 голосов
/ 19 ноября 2011

У меня есть DTO, который состоит из серии коллекций. Каждая из этих коллекций снова содержит различные пары имя-значение в своих InnerLists.

Есть ли способ запросить DTO о конкретном имени и получить его значение ... независимо от коллекции или позиции в InnerList, в которой оно находится?

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Вы можете использовать шаблон как этот. Обратите внимание, что в моем классе есть две разные коллекции, но я представляю унифицированный итератор, который используется в функции Main , чтобы обрабатывать его как одну коллекцию и распечатывать все четные элементы во всех коллекциях.

 class Foo : IEnumerable<int>
    {
        List<int> first = new List<int>();
        List<int> second = new List<int>();


        public Foo()
        {
            first.Add( 1 );
            first.Add( 2 );

            second.Add( 11 );
            second.Add( 12 );
        }


        public IEnumerator<int> GetEnumerator()
        {
            foreach (var f in first)
            {
                yield return f;
            }

            foreach (var f in second)
            {
                yield return f;
            } 
        }
    }

    static void Main(string[] args)
    {
        Foo f = new Foo();

        foreach (var d in f.Where(x => x % 2 == 0))
        {
            Console.WriteLine(d);
        }


        Console.ReadLine();
    }
0 голосов
/ 01 декабря 2011
class DTO
{
  public List<Dictionary<string, object>> collectionList { get; set; } //just a simple example

  public object Get(string key)
  {
    if(collectionList != null)
    {
       foreach(var c in collectionList) //iterate through each collection
       {
        /*If your collection list is a of type List<ICollection>, you have to find the type of c 
        using reflection and then use a switch-case to fetch the key appropriately
        depending on it's implementation. 
        For simplicity I'm assuming all the collection objects are dictionaries*/
         if(c.ContainsKey(key)) 
            return c[key];
       }
    }
    return null;
  }
}
0 голосов
/ 01 декабря 2011

Я не уверен в ваших сомнениях, но если вам нужно сделать запрос для всех этих коллекций в одном выражении Linq, вы можете использовать Concat ().

var list1 = new List<String>();
var list2 = new List<String>();
var list3 = new List<String>();

// get an IEnumerable that contains all lists
var concatEnum = list1.Concat(list2).Concat(list3);

// do everything you want...
var myLinqResult = concatEnum.Select(item => item.ToLower()).ToArray();
...