根据匹配条件从 5 个列表中查找匹配项

莱因哈特

鉴于我有一个看起来像这样的模型:

public sealed class BaseInfo
    {
        public string ValueToBeMatched { get; set; }

        public string CreatedValue { get; set; }
    }

我有初始化BaseInfo类的变量,如下所示:

List<BaseInfo> zeroBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "003",
      CreatedValue = "2007-10-10"
   },
}

List<BaseInfo> firstBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

List<BaseInfo> secondBaseInfo= new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
}

List<BaseInfo> thirdBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

List<BaseInfo> fourthBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "",
      CreatedValue = DateTime.Now.ToString("yyyy-MM-dd")
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

条件是5个列表必须相互匹配2个或更多匹配,然后它将存储到新列表中以获取结果。

我正在考虑对每个列表使用 for 循环,并使每个循环中的 if 语句与条件与列表的每个索引相匹配。但我被困住了。

这是我坚持的代码:

for (int i = 0; i < zeroBaseInfo.Count; i++)
            {
                for (int j = 0; j < firstBaseInfo.Count; j++)
                {
                    for (int k = 0; k < secondBaseInfo.Count; k++)
                    {
                        for (int o = 0; o < thirdBaseInfo.Count; o++)
                        {
                            for (int p = 0; p < fourthBaseInfo.Count; p++)
                            {
                                // I am stuck in this point to what needs to be compare, as if statement only works against comparison value between 1 to 1 and not all of lists.
                            }
                        }
                    }
                }
            }

编辑:

预期输出:

List<BaseInfo> matchedNewLists = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2008-10-10"
   }
}

由于001并且002满足上述 5 个列表中的条件(2 个匹配项或更多)

非常感谢任何帮助和您的回答。

非常感谢!

扫地机

这可以通过一些 LINQ 操作来完成。我将它们分开以明确我在这里做什么:

var oneLongList = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }.SelectMany(x => x);
var allValuesToBeMatched = oneLongList.Select(x => x.ValueToBeMatched);
var grouped = allValuesToBeMatched.GroupBy(x => x);
var filtered = grouped.Where(x => x.Count() >= 2).Select(x => x.Key);
var finalResult = filtered.Select(x => new BaseInfo { ValueToBeMatched = x });

或者您可以将它们合二为一:

var finalResult = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }
    .SelectMany(x => x)
    .Select(x => x.ValueToBeMatched)
    .GroupBy(x => x)
    .Where(x => x.Count() >= 2)
    .Select(x => new BaseInfo { ValueToBeMatched = x.Key });

编辑:

var finalResult = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }
    .SelectMany(x => x)
    .GroupBy(x => x.ValueToBeMatched)
    .Where(x => x.Count() >= 2)
    .Select(x => x.First());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章