2015-03-04 4 views
-2

Рассмотрим,Повторные данные из IEnumerable

public class Obj 
{ 
    public string PropertyName; 
    public string Name; 
    public int Id; 
    public int Value; 
} 

List<Obj> lsObjdata = new List<Obj>(); 
var obj = new Obj { Name = "xyz", PropertyName = "Volume", Id= 1, Value = 25}; 
lsObjdata.Add(obj); 
obj = new Obj { Name = "abc", PropertyName = "Volume", Id= 1, Value = 23}; 
lsObjdata.Add(obj); 
obj = new Obj {Name = "abc", PropertyName = "Oil", Id =1, Value = 45}; 
lsObjdata.Add(obj); 

IEnumerable<IGrouping<String, obj>> results = lsObjData.GroupBy(m => m.Id); 

Теперь моя results будет иметь 3 значения для того же id.My Бизнес требует от меня, чтобы отдавать приоритет OBJ, имеющий xyz как имя и опустить другой, если их свойства совпадают. Но, если xyz не имеет свойства, которое abc имеет? выберите значение этого свойства. Как и инициализация третьего объекта, указанного выше.

obj = new {Name = "abc", PropertyName = "Oil", Id =1, Value = 45} 

Это свойство и значение не существует с именем, как xyz. Это должно быть добавлено к моему окончательному результату. Мой результат должен содержать оба приведенных ниже объекта в списке.

obj = new {Name = "abc", PropertyName = "Oil", Id =1, Value = 45} 
obj = new { Name = "xyz", PropertyName = "Volume", Id= 1, Value = 25}; 

PS: Я сделал с уже решения. Но я не смог использовать выражения Linq/Lambda и получить решение в одной строке/штрихе. Может ли кто-нибудь помочь мне на этом фронте? Спасибо, Sam

+0

язык, на котором бы это компилировать? – stefankmitph

+1

Вам нужно добавить 'GroupBy' на два свойства' ID' и 'PropertyName'. Это даст вам начало. –

+0

@stefankmitph Это просто логика. Кто сказал, что он скомпилирует любого друга? – Kulkarni

ответ

1

Вы должны сгруппировать два свойства - Id, PropertyName, а затем выберите первый объект, заказав сгруппированные данные, как это: -

var results = lsobjdata.GroupBy(x => new { x.Id, x.PropertyName }) 
         .Select(x => x.OrderByDescending(z => z.Name).FirstOrDefault()); 

Вот Working Fiddle с некоторыми образцами данных.

+1

приветствие помощник. спасибо за вход. – Kulkarni

1

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

// Define other methods and classes here 
public class Obj 
{ 
    public string PropertyName; 
    public string Name; 
    public int Id; 
    public int Value; 
} 

public class Key 
{ 
    public string PropertyName; 
    public int Id; 

    public override bool Equals(object obj) 
    { 
    Key item = obj as Key; 

     return item.Id == this.Id && item.PropertyName == this.PropertyName; 
    } 

    public override int GetHashCode() 
    { 
     int hash = 13; 
     hash = (hash * 7) + Id.GetHashCode(); 
     hash = (hash * 7) + PropertyName.GetHashCode(); 
     return hash; 
    } 
} 

void static Main() 
{ 
    List<Obj> lsObjdata = new List<Obj>(); 
    HashSet<Key> keys = new HashSet<Key>(); 
    var obj = new Obj { Name = "xyz", PropertyName = "Volume", Id= 1, Value = 25}; 
    lsObjdata.Add(obj); 
    obj = new Obj { Name = "abc", PropertyName = "Volume", Id= 1, Value = 23}; 
    lsObjdata.Add(obj); 
    obj = new Obj {Name = "abc", PropertyName = "Oil", Id =1, Value = 45}; 
    lsObjdata.Add(obj); 
    obj = new Obj {Name = "abc", PropertyName = "Gas", Id =1, Value = 45}; 
    lsObjdata.Add(obj); 
    obj = new Obj {Name = "edf", PropertyName = "Gas", Id =1, Value = 45}; 
    lsObjdata.Add(obj); 
    var results = lsObjdata.GroupBy(m => new Key { Id = m.Id, PropertyName = m.PropertyName }) 
           .Select<IGrouping<Key,Obj>,IEnumerable<Obj>>(x => 
           { 
            if (x.Any(v => v.Name == "xyz") && !keys.Contains(x.Key)) 
            { 
              return new Obj[]{x.First(v => v.Name == "xyz")}; 
            } 
            else if (!keys.Contains(x.Key as Key)) 
            { 
              return x.Select(v=>v);          
            } 
            else 
             return null; 
           }) 
           .SelectMany(x=>x) 
           .Where(x=> x != null); 

    foreach (var res in results) 
    { 

      Console.WriteLine(res.PropertyName + " "+res.Name+" "+res.Id+" "+ res.Value); 
    } 

    Console.WriteLine(results); 
} 

enter image description here

Смежные вопросы