【问题标题】:Get unique items from multiple lists using LINQ- C# [closed]使用 LINQ-C# 从多个列表中获取唯一项目 [关闭]
【发布时间】:2015-03-17 16:14:18
【问题描述】:

我有 3 个列表。

ListA<items>
ListB<items>
ListC<items>

我必须从每个列表中选择一个项目,但 item.itemID 对于这些项目中的每一个都应该是唯一的。我怎样才能做到这一点?提前致谢。

【问题讨论】:

  • 使用Concat 然后Distinct
  • Distinct 仅在他进行比较或对象引用相同或项目是结构时才有效
  • @TheCatWhisperer Distinct 如果对象是可比较的,则可以工作——不仅仅是相同的引用或结构或简单的对象。但是, concat + distinct 不符合他的标准。
  • 你是对的,如果它们具有可比性的话......

标签: c# linq unique items


【解决方案1】:
List<items> concat = new List<items>();
concat.AddRange(ListA);
concat.AddRange(ListB);
concat.AddRange(ListC);

List<items> result = new List<items>();
foreach (var item in concat)
{
   if (result.Where(x => x.itemId == item.itemId).Count() == 0)
   {
       result.add(item);
   }
}
//result should now contain what you are looking for

【讨论】:

  • 这行不通,因为它可以从 ListA 中获得多个答案,而不是从每个列表中获得一个答案。
  • 我必须从每个列表中获取一项。我认为这个逻辑不会满足这个要求,因为列表是在这里连接的。
【解决方案2】:

所以您希望每个列表中恰好有一个项,而该项尚未从之前的列表中被选中?

然后从 ID 不在之前选择中的列表中进行选择。也许是这样的:

var itemA = listA.First(); // any item is unique, since this is our first one
var itemB = listB.First(b => b.ID != itemA.ID);
var itemC = listC.First(c => c.ID != itemA.ID && c.ID != itemB.ID);

如果不知道列表的数量,那么我们需要让它更动态一些。也许是这样的:

var selectedItems = new List<Item>();
foreach (var list in listOfLists)
    selectedItems.Add(list.First(x => selectedItems.Count(y => y.ID == x.ID) == 0));

它的作用是遍历“列表列表”(由于列表的数量未知,它必须在集合数据结构中)并从当前已知的选定项目所在的每个项目中获取第一个项目没有匹配的 ID。这应该会从每个列表中选择一个项目。

(这一切都假定列表包含您要查找的有效项目。如果不是这种情况,您可以改用FirstOrDefault() 并检查空值。)

【讨论】:

  • 如果列表是 {A,B,C},{B,C,D},{A,B},这将不起作用 - 结果应该是 C,D,A 或 C, D、B 或 B、D、A 或 B、C、A 等
  • 这在我的场景中工作得很好。谢谢。
【解决方案3】:
public class items 
{
    public int id {get;set;}
}
void Main()
{
    var l1=new List<items>{new items {id=1}, new items {id=2}, new items {id=3}};
    var l2=new List<items>{new items {id=2}, new items {id=3}, new items {id=4}};
    var l3=new List<items>{new items {id=1}, new items {id=2}};
    var result=l1
            .Join(l2,(k1)=>true,(k2)=>true,(a1,a2)=>new {a1,a2})
            .Join(l3,(k1)=>true,(k2)=>true,(b1,b2)=>new {b1.a1,b1.a2,a3=b2})
            .Where(rec=>rec.a1.id!=rec.a2.id && rec.a2.id!=rec.a3.id && rec.a1.id!=rec.a3.id)
            .First();
    Console.WriteLine("{0},{1},{2}",result.a1.id,result.a2.id,result.a3.id);
}

在可能的答案 (132,142,231,241,321,341,342) 中,它将选择并返回第一个 (132)。

示例代码:http://csharppad.com/gist/98a076bdd4e01dbd82be

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多