试图比较两个列表c# - 应该工作吗?

时间:2015-09-09 07:46:38

标签: c# list compare sequence

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

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

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

中找到

其次,我想将新List<string>AllDrawings<string, List<string>>中的列表进行比较。该方法最终应该返回一个字符串,其中包含来自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

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

3 个答案:

答案 0 :(得分:1)

好的..我在评论中已经说过,但只是为了确保你不会因为不使用linq而大吼大叫等等:

您的计划在您告诉我们的情况下似乎是正确的。

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

  • 仅来自importedata的true件事
  • 只有itemstocompare
  • 中列出的内容
  • 输入列表未排序

- &GT; 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

这意味着您必须忽略输入数据中的某些内容。也许有些字符串是大写/小写?也许有些字符串里面有空格而其他字符串没有?

答案 1 :(得分:0)

此代码:

        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;

P.S。 如果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

答案 2 :(得分:0)

如果字符串真的与外壳匹配,那么代码就是正确的。我建议你检查你的字符串序列 - 创建一个可读的字符串并添加适当的断点。如果这是缺少的,那么也尝试对不区分大小写进行排序

    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;
        }
    }