使用LINQ-C#从多个列表中获取唯一项

时间:2015-03-17 16:14:19

标签: c# linq unique items

我有3个名单。

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

因此,您希望每个列表中只有一个项目,而该项目尚未从之前的列表中选择过吗?

然后从上一个选择中不包含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()并检查空值。)

答案 2 :(得分:0)

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