【问题标题】:Returning data from a IEnumerable从 IEnumerable 返回数据
【发布时间】:2015-03-04 10:46:01
【问题描述】:

考虑一下,

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。我的业务要求我优先考虑具有 xyz 作为名称的 obj,如果它们的属性匹配,则省略另一个。但是,如果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 表达式并在单行/笔划中获得解决方案。 有人可以在这方面帮助我吗? 谢谢, 山姆

【问题讨论】:

  • 这会编译成哪种语言?
  • 您需要在 IDPropertyName 两个属性上添加 GroupBy 。这会给你一个开始。
  • @stefankmitph 这只是逻辑。谁说它可以在任何地方编译?
  • @sam 标签 c#-4.0 告诉我...没有冒犯的伙伴!

标签: linq c#-4.0 collections lambda


【解决方案1】:

您需要按两个属性进行分组 - Id, PropertyName,然后通过对分组数据进行排序来选择第一个对象,如下所示:-

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

这是Working Fiddle 和一些示例数据。

【讨论】:

    【解决方案2】:

    因为你没有提到你想要每个结果集中的第一个。我正在提供替代解决方案。

    // 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多