【问题标题】:Solid way to filter lists with different values and list sizes过滤具有不同值和列表大小的列表的可靠方法
【发布时间】:2019-08-06 19:02:49
【问题描述】:

什么是从 C# 语言中不同大小和不同值的多个列表中过滤数据的正确且可靠的方法?

我有 5 个列表(示例):

1。 Wire1{“HC:1”、“OGB:2”、“KEL:1”、“ORG:8”、“HAS:10”}

  1. Wire2{“HC:1”、“OSB:1”、“KEL:1”、“ORG:1”、“HPS:5”、“ORG:12”、“HAS:25”}
  2. Wire3{“HC:5”、“ORB:5”、“KEL:1”、“ORG:2”、“HPS:4”、“OLG:1”}
  3. Wire4{“HC:4”、“OGB:2”、“KEL:1”、“ORG:1”、“HFS:5”}
  4. Wire5{“HC:1”、“OGB:5”、“KEL:1”、“ORG:2”、“HAS:5”、“CCC:1”、“ORC:10”、“HAS: 5"}

我需要检查电线是否有相同的连接(这些是上面示例中的列表元素)并返回它们。

public class HarnessAndHousings  //List<HarnessAndHousings> Lists...
    {
        public int id { get; set; }
        public string issue { get; set; }
        public string Harness { get; set; }
        public List<string> Housings { get; set; } = new List<string>();
    }

public class Errors  // -> List<Errors> Output; 
    {
        public string harness { get; set; }
        public string harness2 { get; set; }
        public string housing { get; set; }
    }

//What i did is horrible but how to do that in another way correct way?

  public static void CheckErrors(List<HarnessAndHousings> harness)
        {
            foreach(HarnessAndHousings h in HarnessAndHousings)
            {
                foreach(string s in h.Housings)
                {
                    foreach(HarnessAndHousings h2 in HarnessAndHousings)
                    {
                        List<string> matches = h2.Housings.Where(x => h2.Housings.Contains(s)).ToList();

                        foreach(string m in matches)
                        {
                            Errors.Add(new Errors { harness = h.Harness, harness2 = h2.Harness, housing = m });
                        }

                        Console.WriteLine(Errors.Count);
                    }
                }
            }
        }



【问题讨论】:

  • 我发现第一个示例和后面的代码之间没有共同点。请edit您的问题包括minimal reproducible example,并根据需要构建列表以演示您所看到的问题。
  • 最后一句话说你需要做什么并不清楚。 “如果电线具有相同的连接”是什么意思?这可能意味着很多事情。您发布的代码说它正在检查错误,但我们不知道这意味着什么。它正在添加到List&lt;HarnessAndHousings&gt;。没有电线。我无法建立联系(双关语。)

标签: c# linq filter


【解决方案1】:

您的代码存在一些问题或不完整。但是,如果您要查找的只是“具有相同连接的电线”,您可以使用 IEnumerable 的Intersect method 来获取匹配的项目。

//Wire1{"HC:1", "OGB:2", "KEL:1", "ORG:8", "HAS:10" }
var wire1 = new List<string>();
//Wire2{"HC:1", "OSB:1", "KEL:1", "ORG:1", "HPS:5", "ORG:12", "HAS:25"}
var wire2 = new List<string>();

//matching: {"HC:1", "KEL:1" }
var matchingWires = wire1.Intersect(wire2);

如果您希望从同一列表中删除重复项,请使用 Distinct,如下所示:

//Wire5{"HC:1", "OGB:5", "KEL:1", "ORG:2", "HAS:5", "CCC:1", "ORC:10", "HAS:5"}
var wire2 = new List<string>();
//unique: {"HC:1", "OGB:5", "KEL:1", "ORG:2", "HAS:5", "CCC:1", "ORC:10"}
var uniqueWires = wire5.Distinct();

使用任一结果列表,您都可以通过这种方式快速获取错误列表:

var errors = matchingWires.Select(x => new Errors { //fill your object accordingly 
});                   

请注意,以上列表仅用于演示目的,并未正确实例化。

HTH

【讨论】:

  • 是的,它不完整,但我看到的这种方法是错误的。因为稍后我需要删除相同电线(wire1和wire1)的错误,之后需要删除相同的错误(wire1和wire2;wire2和wire1)
  • @QuikBytes 不确定我是否了解您的需求,但也许您正在寻找Except(而不是Intersect)?这会产生相反的、不匹配的项目。
  • 我会试着解释这个问题:) 我们从客户那里得到文档,文档基本上是电线和它们的连接。但有时我们会得到错误的文档,电线不能有相同的连接。所以我需要检查这些列表是否有相同的连接。并提供错误在哪里。就像我的错误类。
  • @QuikBytes 可能是最好的,如果你更新你的帖子以包含预期的结果:) 无论哪种方式我都肯定你可以利用内置的可枚举功能来找到你需要的东西。
【解决方案2】:

不优雅的解决方案:

    static void Main(string[] args) {
        var wire1 = new List<string>() { "HC:1", "OGB:2", "KEL:1", "ORG:8", "HAS:10" };
        var wire2 = new List<string>() { "HC:1", "OSB:1", "KEL:1", "ORG:1", "HPS:5", "ORG:12", "HAS:25" };
        var wire3 = new List<string>() { "HC:5", "ORB:5", "KEL:1", "ORG:2", "HPS:4", "OLG:1" };
        var wire4 = new List<string>() { "HC:4", "OGB:2", "KEL:1", "ORG:1", "HFS:5" };
        var wire5 = new List<string>() { "HC:1", "OGB:5", "KEL:1", "ORG:2", "HAS:5", "CCC:1", "ORC:10", "HAS:5" };

        var wires = new List<List<string>>() { wire1, wire2, wire3, wire4, wire5 };
        var errors = new List<string>();

        foreach (var wire in wires) {
            var otherWires = wires.ToList();
            otherWires.Remove(wire);

            foreach (var connection in wire) {
                if (otherWires.Any(x => x.Contains(connection))) {
                    errors.Add(connection);
                }
            }
        }

        errors = errors.Distinct().ToList();
        Console.WriteLine(string.Join(", ", errors));
    }

【讨论】:

  • 不优雅但看起来不错,但另一个认为 errors.Distinct() 是如何工作的......在你的情况下它会起作用,但在我的情况下我认为它不会。但是谢谢你的例子,我有一些想法。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 2017-10-13
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多