尝试比较两个列表应该有效

本文关键字:列表 两个 有效 比较 | 更新日期: 2023-09-27 18:11:55

我有一个方法,看起来像这样:

GetDrawing(Dictionary<string, List<string>> AllDrawings, Dictionary<string, bool> ImportData, string[] ItemsToCompare)

首先,该方法用ImportData<string, bool>中所有值为true且可以在string[] ItemsToCompare中找到的项目创建一个新的List<string>

其次,我想比较新的List<string>AllDrawings<string, List<string>>的List。该方法最终应该返回一个字符串,其中包含两个列表匹配的AllDrawings<string>, List<String>>中的键。

我现在已经花了很多时间试图弄清楚这个自己,也尝试了每一个答案,我能找到类似的问题在这里Stackoverflow,但没有运气。

下面是我的方法的完整代码。如上所述,我尝试了很多不同的方法来比较列表,但下面的是最新的尝试。

  public static string GetDrawing(Dictionary<string, List<string>> AllDrawings, Dictionary<string, bool> ImportData, string[] ItemsToCompare)
    {
        string FinalDrawing = "";
        try
        {
            List<string> AllCorrect = new List<string>();
            foreach (var item in ImportData)
            {
                if (item.Value == true && ItemsToCompare.Contains(item.Key))
                    AllCorrect.Add(item.Key);
            }
            AllCorrect.Sort();
            foreach (var DrawItem in AllDrawings)
            {
                DrawItem.Value.Sort();
                var match = AllCorrect.SequenceEqual(DrawItem.Value);
                if (match == true)
                {
                    FinalDrawing = DrawItem.Key;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return FinalDrawing;
    }

我的问题是var match = AllCorrect.SequenceEqual(DrawItem.Value);的返回值是false,因此FinalDrawing从未设置。

所有的答案都非常感谢。提前感谢!

尝试比较两个列表应该有效

Ok…我已经在评论中说过了,但只是为了确保你不会因为不使用-linq之类的而被骂得太多:

你的程序看起来是正确的,直到你告诉我们的那一点

有一个简单的测试。我提供了一些存根数据,涵盖了您似乎要检查的所有内容:

  • 只有true的东西从importdata
  • 只在itemstocompare
  • 中列出的东西
  • 输入列表未排序

-> http://rextester.com/HAE73942

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public class Program
{
    // your original function, nothing changed
    public static string GetDrawing(Dictionary<string, List<string>> AllDrawings, Dictionary<string, bool> ImportData, string[] ItemsToCompare)
    {
        string FinalDrawing = "";
        try
        {
            List<string> AllCorrect = new List<string>();
            foreach (var item in ImportData)
            {
                if (item.Value == true && ItemsToCompare.Contains(item.Key))
                    AllCorrect.Add(item.Key);
            }
            AllCorrect.Sort();
            foreach (var DrawItem in AllDrawings)
            {
                DrawItem.Value.Sort();
                var match = AllCorrect.SequenceEqual(DrawItem.Value);
                if (match == true)
                {
                    FinalDrawing = DrawItem.Key;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return FinalDrawing;
    }
        public static void Main(string[] args)
        {
            var allDrawings = new Dictionary<string, List<string>>();
            allDrawings.Add("aaa", new List<string>{ "a03", "a01", "a02" }); // originally unsorted
            allDrawings.Add("bbb", new List<string>{ "b03", "b01", "b02" }); // originally unsorted
            allDrawings.Add("ccc", new List<string>{ "c03", "c01", "c02" }); // originally unsorted
            var import = new Dictionary<string, bool>();
            import.Add("b01", false); // falsey
            import.Add("a05", true); // not in comparison
            import.Add("a03", true);
            import.Add("c01", false); // falsey
            import.Add("a02", true);
            import.Add("a04", true); // not in comparison
            import.Add("a01", true);
            var toCompare = new string[9];
            toCompare[0]="a01"; toCompare[1]="a02"; toCompare[2]="a03";
            toCompare[3]="b01"; toCompare[4]="b02"; toCompare[5]="b03";
            toCompare[6]="c01"; toCompare[7]="c02"; toCompare[8]="c03";
            var result = GetDrawing(allDrawings, import, toCompare);
            Console.WriteLine("Result: " + result);
        }
}

它工作得很好,打印出aaa

这意味着您一定忽略了输入数据中的某些内容。也许有些字符串是大写/小写的?也许有些字符串里面有空白,而另一些没有?

代码:

        List<string> AllCorrect = new List<string>();
        foreach (var item in ImportData)
        {
            if (item.Value == true && ItemsToCompare.Contains(item.Key))
                AllCorrect.Add(item.Key);
        }
        AllCorrect.Sort();

可以简化为:

     List<string> AllCorect = ImportData.Where(vp => 
       ItemsToCompare.Contains(vp.Key) && vp.Value).Select(vp => vp.Key).OrderBy(vp => vp).ToList();

要解决第二个问题,你可以这样做:

return AllDrawings.First(l => l.Value.OrderBy(l2 => l2).SequenceEqual(AllCorect)).Key;

注:如果First()总是抛出异常,那么它表明问题在于这个列表如何填充值,这是一个不同的问题。

的例子:

    public static string GetDrawing(Dictionary<string, List<string>> AllDrawings, Dictionary<string, bool> ImportData, string[] ItemsToCompare)
    {
        List<string> AllCorect = ImportData.Where(vp => 
           ItemsToCompare.Contains(vp.Key) && vp.Value).Select(vp => vp.Key).OrderBy(vp => vp).ToList();
        return AllDrawings.First(l => l.Value.OrderBy(l2 => l2).SequenceEqual(AllCorect)).Key;
    }

    static void Main(string[] args)
    {
        List<string> list1 = new List<string>() { "one", "two", "three" };
        List<string> list2 = new List<string>() { "five", "six", "seven" };
        Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>()
        {
            {"first", list1}, {"second", list2}
        };
        string[] itemsToCompare = { "one", "two", "three" };
        var dict2 = new Dictionary<string, bool>()
        {
            {"one", true},
            {"two", true},
            {"three", true}
        };
        var result = GetDrawing(dict, dict2, itemsToCompare);
        Console.WriteLine(result);
    }

输出:first

如果字符串确实匹配,那么您的代码也将是正确的。我建议你检查你的字符串序列——创建一个可读的字符串并添加适当的断点。如果这里缺少大小写,还可以尝试排序不区分大小写

    AllCorrect.Sort(StringComparer.InvariantCultureIgnoreCase);
    var AllCorrectInfo = string.Join(", ", AllCorrect.ToArray());
    foreach (var DrawItem in AllDrawings)
    {
        DrawItem.Value.Sort();
        var DrawItemInfo = string.Join(", ", DrawItem.Value.ToArray());
        var match = AllCorrect.SequenceEqual(DrawItem.Value, StringComparer.InvariantCultureIgnoreCase);
        if (match == true)
        {
            FinalDrawing = DrawItem.Key;
        }
    }