【问题标题】:List<object> compare [closed]列表<对象>比较[关闭]
【发布时间】:2013-08-27 14:31:10
【问题描述】:

我已经搜索了一些示例,但没有找到与我所拥有的和我想要实现的目标相似的示例。

我有 2 个列表

class object1
{
   string obj1_name;
   int obj1_qty;
}
List<object1> listA

class object2
{
   string obj2_name;
   int obj2_qty;
}
List<object2> listB;

现在,使用 ListA 作为主列表,我想查看 ListB 是否包含同名的对象,如果是,数量是多少,因此 obj1_qty = obj2_qty 是否相互?如果没有,则存在差异,我需要显示它,最有可能在第三个列表中,如果它们存在的话,这将是差异。注意,ListA 可以大于或小于 ListB

  • 显示所有列表 A(主列表包含所有对象)
  • 显示两个列表中存在的名称/数量之间的差异。

感谢

【问题讨论】:

  • 我建议您发布您迄今为止尝试过的内容。如果你不表现出你已经付出了努力,那么没有多少人愿意为你编写代码。
  • 为什么需要两个具有相同members 的类?
  • 这两个对象是否有可能从公开NameQty 属性的同一接口继承?同样,您的代码不符合要求,可能已关闭。请edit your question 并至少提供类的完整可编译版本。
  • 嗨斯科特。我发现代码太少我得到否定的 cmets,太多的代码我得到否定的答案......但是感谢您的方法.. 对象不能从相同的接口继承,因为类不同。我在这里简化了它。列表 A 有 5 个对象,列表 B 有 3 个,我只对上面显示的那些感兴趣

标签: c# linq list


【解决方案1】:

听起来像一个连接会为你工作:

var query = from a in listA
            join b in listB on a.obj1_name equals b.obj2_name
            where a.obj1_qty != b.obj2_qty
            select new {
                Name = a.obj1_name,
                QtyA = a.obj1_qty,
                QtyB = b.obj2_qty,
                Diff = a.obj1_qty - b.obj2_qty
                };

【讨论】:

  • 你需要替换=中的onwith equals
  • @ScottChamberlain 总是忘记那部分 - 谢谢,已修复。
  • @DStanley。您是否缺少 .ToList() .... 请原谅我的无知
  • 你不需要ToList(),除非你真的想要List。没有它你仍然可以迭代结果。
【解决方案2】:

最简单的方法就是使用 Linq 的连接

var items = from l1 in listA
            join l2tmp1 in listB on l1.obj1_name equals l2.obj2_name into l2tmp2
            from l2 in l2tmp2.DefaultIfEmpty();
            select new { 
                 ItemA = l1, 
                 ItemB = l2, 
                 Name = l1.obj1_name, 
                 Difference = (l2 == null) ? 0 : l1.ob1_qty - l2.ob2_qty
            };

items 现在将持有匿名类的 IEnumerable,该匿名类持有对 ListA 中项目的引用、对 listB 中项目的引用、匹配名称和差异。

【讨论】:

  • 那么如果他确实使用了界面,你会使用什么解决方案?
  • 一个自定义的 IEqualityComparer 来比较两者,然后使用......好吧,你是对的,一个界面无济于事。我已经从我的答案中删除了那部分。
  • 在处理这些数据时,一个接口可能有助于解决其他问题,但对于 这个特定问题,无论它们是否实现相同的 Join 可能是最好/最简单的接口与否。
  • @ScottChamberlain:这行得通。但是,如果列表 A 有 37 个元素,而列表 B 有 34 个,则新的 var items 只有 34 个元素。列表 B 中不存在但列表 A 中存在的额外 3 个元素丢失了
  • 你在你的问题中说“我想看看listB是否包含同名的对象”如果listB中没有匹配的项目那么你说你没有关心对象。如果 listA 或 listB 中不存在对象,请通过 editing your question 准确说明您想要的结果集中的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多