根据条件将元素添加到类中的列表中,该列是List <class>的一部分

时间:2015-09-11 11:30:02

标签: c#

让我们有一个包含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。我想检查一下ListOfSamplesFinalList是否与我所拥有的NewItem相同。否则,使用ListOfSamplesFinalList中创建新的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

4 个答案:

答案 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);
}