我有一个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));
}
}
所以我总是得到null,虽然有相同的条目
两个foreach循环旁边的任何想法?
答案 0 :(得分:2)
是的,您可以检查列表列表中的任何列表是否已包含您想要添加的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));
如评论中所述,您还可以修改谓词以限制每个列表中的女巫项目进行检查。注意:我在以下示例中为谓词使用单独的变量。
如果您想将搜索范围限制为每个列表中的前5个项目:
Func<IEnumerable<DataToShow>, bool> firstFiveItemsContainEquivalentInstance = (dataList) => dataList.Take(5).Any(IsEquivalentInstance);
var listWhereFirstFiveItemsContainEquivalentInstance = listOfLists.FirstOrDefault(firstFiveItemsContainEquivalentInstance);
仅检查第一项是相对简单的,如下所示。
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());
答案 1 :(得分:0)
对于DataToShow,您需要覆盖Equals方法
public override bool Equals(object obj)
{
if (obj == null) return false;
DataToShow x = obj as DataToShow;
if (x == null) return false;
else return (x.Mode == this.Mode) && (x.State == this.State);
}
现在您可以使用为集合定义的Contains方法
foreach (List<Data> innerlist in listlist) {
if(innerlist.Contains(data))
return innerlist;
return Null;
}
为datapack中的每个数据调用此函数。