我有3个名单。
ListA<items>
ListB<items>
ListC<items>
我必须从每个列表中选择一个项目,但item.itemID对于每个项目都应该是唯一的。我怎样才能实现这一目标?提前谢谢。
答案 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)。