我有一个List<List<Data>>,其中一些List<Data>夹在foreach循环中。因此,在创建新的List<Data>之前,我需要检查List<Data>中的任何List<List<Data>>中是否已经存在某些值。如果是这样,我需要返回此列表,以将数据添加到此List<Data>.

private List<List<DataToShow>> listList;
private List<DataToShow> list;

private void sortTestData()
{
     listList = new List<List<DataToShow>>();

     foreach (DataToShow data in dataPack)
     {
         List<DataToShow> list = new List<DataToShow> { data };

            if (listList.Count != 0)
                checkModusStatus(data);

            listList.Add(list);
        }
    }

    private void checkModusStatus(DataToShow data)
    {
        for (int i = 0; i < listList.Count; i++)
        {
            var value = listList[i].Where(x => (x.Mode == data.Mode) && (x.State == data.State));
        }


}

所以我总是空的,尽管有相同的条目

除了两个foreach循环外还有其他想法吗?

最佳答案

检查列表列表中的任何列表是否与谓词匹配

是的,您可以检查列表中的任何列表是否已经包含要添加的DataToShow的等效实例,如下所示:

bool equivalentInstancePresent = listList.Any(dataList => dataList.Any(data => IsEquivalentInstance(data));

private bool IsEquivalentInstance(DataToShow data)
{
    // your check here
}


使用Any(predicate)将遍历相应的IEnumerable并在找到与谓词匹配的元素后立即返回true。否则,它将在迭代完成后返回false

相同linq表达式的简短版本:

bool equivalentInstancePresent = listList.Any(dataList => dataList.Any(IsEquivalentInstance);


获取与谓词匹配的列表中的第一个列表

如果您还需要返回包含等效实例的列表(如您的问题所述),则可以使用以下表达式

List<DataToShow> listWithEquivalentInstancePresent = listList.FirstOrDefault(dataList => dataList.Any(IsEquivalentInstance));




根据评论中的要求,您还可以修改谓词以限制每个列表中要检查的女巫项。注意:在以下示例中,我对谓词使用了单独的变量。

修改谓词以仅检查第x个项目

如果要将搜索范围限制为每个列表的前5个项目:

Func<IEnumerable<DataToShow>, bool> firstFiveItemsContainEquivalentInstance = (dataList) => dataList.Take(5).Any(IsEquivalentInstance);
var listWhereFirstFiveItemsContainEquivalentInstance = listOfLists.FirstOrDefault(firstFiveItemsContainEquivalentInstance);


修改谓词以仅检查每个列表中的第x个项目

如下所示,仅检查第一项相对简单。

Func<IEnumerable<DataToShow>, bool> firstItemIsEquivalent = (dataList) => IsEquivalentInstance(dataList.FirstOrDefault());
var listWhereFirstItemIsEquivalentInstance = listOfLists.FirstOrDefault(firstItemIsEquivalent);


仅检查每个列表中第二项的谓词如下

Func<IEnumerable<DataToShow>, bool> secondItemIsEquivalent = (dataList) => IsEquivalentInstance(dataList.Skip(1).Take(1).SingleOrDefault());

09-10 20:08
查看更多