让我们有一个包含2个字段的简单类
public class Sample
{
public int IdOfSample;
public string SampleName;
}
另一个使用这个
public class ListOfSamples
{
public int IdOfList;
public List<Sample> SampleList;
}
最后,由于我们将使用几个不同的ListOfSamples,请列出它们:
public static List<ListOfSamples> FinalList = new List<ListOfSamples>();
现在出现问题:
我创建了一个新的Sample
(让我们称之为NewItem
),其中包含一些名称和ID。我想检查一下ListOfSamples
中FinalList
是否与我所拥有的NewItem相同。否则,使用ListOfSamples
在FinalList
中创建新的IdOfList = NewItem.IdOfSample
。
我想我得到的第一部分是检查你是否应该添加一个新列表(即ListOfSamples
指定的IdOfList
不存在:
Sample NewItem = new Sample()
{
IdOfSample = 12345,
SampleName = "Some name"
};
int index = FinalList.FindIndex(f => f.IdOfList == NewItem.IdOfSample);
if (!FinalList.Any() || index == -1)
{
ListOfSamples NewList = new ListOfSamples()
{
IdOfList = NewItem.IdOfSample,
SampleList = new List<Sample>()
};
NewList.SampleList.Add(NewItem);
FinalList.Add(NewList);
}
现在,我正在尝试构建一个语句,如果FinalList
中已经存在指定Id的列表,只需添加新项目,但到目前为止我认为我对LINQ的经验有限正在展示,我尝试的任何东西似乎都无法运作。
所以:
如果ListOfSamples
中存在IdOfList == NewItem.IdOfSample
FinalList
,则NewItem
添加ListOfSamples
。
答案 0 :(得分:1)
怎么样
if (!FinalList.Any() || index == -1)
...
else
{
FinalList[index].SampleList.Add(NewItem);
}
答案 1 :(得分:1)
如果您只是想检查列表项是否存在,那么合适的LINQ语句可以是:
if (FinalList.Any(l => l.IdOfList == NewItem.IdOfSample))
{
// ...
}
如果您想要处理该项目,那么您可以尝试按如下方式检索它:
var existingList = FinalList.SingleOrDefault(l => l.IdOfList == NewItem.IdOfSample);
if (existingList != null)
{
existingList.Add( ... );
}
如果你想保证唯一性,也许值得考虑使用HashSet列表......
答案 2 :(得分:1)
如果用null
替换ListOfSamples
,那么您将获得在O(1)时间内进行查找的功能,并保证顶级的ID是唯一的。然后你可以添加这样的东西。
Dictionary<int, List<Sample>>
Dictionary<int, List<Sample>> FinalList = new Dictionary<int, List<Sample>>();
Sample NewItem = new Sample()
{
IdOfSample = 12345,
SampleName = "Some name"
};
List<Sample> list;
if (!FinalList.TryGetValue(NewItem.IdOfSample, out list))
{
list = new List<Sample>();
FinalList.Add(NewItem.IdOfSample, list);
}
list.Add(NewItem);
将查看字典是否包含您传递密钥的条目,如果有,则返回TryGetValue
,如果不是,则返回true
。如果它确实有一个键的条目,它还会将条目的值(在本例中为您的样本列表)分配给false
参数。因此,我们检查它是否返回out
,在这种情况下,我们创建一个新列表并将其添加到字典中。然后我们将样本添加到我们从字典中获得的列表中,或者只是创建并放入字典中。
答案 3 :(得分:1)
如果我理解的话......
// search for the list with the given Id
var listOfSamples = finalList.Where(fl => fl.IdOfList == newItem.IdOfSample).FirstOrDefault();
if (listOfSamples == null)
{
// not found
// add new List with the new item in final list
finalList.Add(new ListOfSamples {IdOfList = newItem.IdOfSample, SampleList = new List<Sample>{newItem}} );
}
else
{
// found
// add the new item into the found list
listOfSamples.SampleList.Add(newItem);
}