Выровнять объект коллекции LINQ с помощью вложенных коллекций объектов - PullRequest
2 голосов
/ 22 ноября 2011

Это сложный вопрос. Я пытаюсь сгладить коллекцию объектов LINQ. Каждый элемент в коллекции может иметь две коллекции других объектов. Смотрите пример ниже.

public class DemoClass
{
    public string Name {get; set;}
    public string Address {get; set;}
    public List<Foo> Foos = new List<Foo>();
    public List<Bar> Bars = new List<Bars>();
}

Что я делал, так это использовал этот блок кода для выравнивания этого объекта

var output = from d in DemoClassCollection
    from f in d.Foos
    from b in d.Bars
    select new {
        d.Name, 
        d.Address,
        f.FooField1, 
        f.FooField2, 
        b.BarField1,
        b.BarField2
    };

Но проблема в том, что я получаю только тех объектов DemoClass, которые имеют объекты в коллекциях Foos и Bars. Мне нужно получить все объекты в DemoClass независимо от того, есть ли объекты в коллекциях Foos и Bars.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Звучит так, как вы, возможно, захотите использовать DefaultIfEmpty:

var output = from d in DemoClassCollection
    from f in d.Foos.DefaultIfEmpty()
    from b in d.Bars.DefaultIfEmpty()
    select new {
        d.Name, 
        d.Address,
        FooField1 = f == null ? null : f.FooField1, 
        FooField2 = f == null ? null : f.FooField2, 
        BarField1 = b == null ? null : b.BarField1, 
        BarField2 = b == null ? null : b.BarField2
    };
3 голосов
/ 22 ноября 2011

Похоже, что левое внешнее объединение в Linq будет работать (http://msdn.microsoft.com/en-us/library/bb397895.aspx

var output = from d in DemoClassCollection
    from f in d.Foos.DefaultIfEmpty()
    from b in d.Bars.DefaultIfEmpty()
    select new {
        d.Name, 
        d.Address,
        f.FooField1, 
        f.FooField2, 
        b.BarField1,
        b.BarField2
    };
0 голосов
/ 22 ноября 2011

Я полагаю, что вы можете реализовать IComparer для выполнения пользовательских соединений или объединений в linq в зависимости от того, как вы реализуете метод CompareTo ()

Из MSDN: http://msdn.microsoft.com/en-us/library/system.icomparable.aspx

using System;
using System.Collections;

  public class Temperature : IComparable 
  {
  // The temperature value
  protected double temperatureF;

    public int CompareTo(object obj) {
    if (obj == null) return 1;

    Temperature otherTemperature = obj as Temperature;
    if (otherTemperature != null) 
        return this.temperatureF.CompareTo(otherTemperature.temperatureF);
    else
       throw new ArgumentException("Object is not a Temperature");
}

public double Fahrenheit 
{
    get 
    {
        return this.temperatureF;
    }
    set {
        this.temperatureF = value;
    }
}

public double Celsius 
{
    get 
    {
        return (this.temperatureF - 32) * (5.0/9);
    }
    set 
    {
        this.temperatureF = (value * 9.0/5) + 32;
    }
  }
 }

 public class CompareTemperatures
{
 public static void Main()
 {
  ArrayList temperatures = new ArrayList();
  // Initialize random number generator.
  Random rnd = new Random();

  // Generate 10 temperatures between 0 and 100 randomly.
  for (int ctr = 1; ctr <= 10; ctr++)
  {
     int degrees = rnd.Next(0, 100);
     Temperature temp = new Temperature();
     temp.Fahrenheit = degrees;
     temperatures.Add(temp);   
  }

  // Sort ArrayList.
  temperatures.Sort();

  foreach (Temperature temp in temperatures)
     Console.WriteLine(temp.Fahrenheit);

}}

// The example displays the following output to the console (individual
// values may vary because they are randomly generated):

// 2 // 7 // 16 // 17 // 31 // 37 // 58 // 66 // 72 // 95

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...