Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找作为子字符串包含在两个列表中的项_C#_Linq - Fatal编程技术网

C# 查找作为子字符串包含在两个列表中的项

C# 查找作为子字符串包含在两个列表中的项,c#,linq,C#,Linq,我有两份清单: var files = new List<string> {"ax_11118.txt", "ax_422226.txt", "ax_4346436.txt", "678678678.txt"}; var codes = new List<string> { "1111", "1234", "5555" }; var files=新列表{“ax_11118.txt”、“ax_422226.txt”、“ax_4346436.txt”、“678678678.

我有两份清单:

var files = new List<string> {"ax_11118.txt", "ax_422226.txt", "ax_4346436.txt", "678678678.txt"};
var codes = new List<string> { "1111", "1234", "5555" };
var files=新列表{“ax_11118.txt”、“ax_422226.txt”、“ax_4346436.txt”、“678678678.txt”};
var代码=新列表{“1111”、“1234”、“5555”};
我需要在包含以下格式的文件中查找项目:“ax_代码”。这种情况下的结果应该是:
{“ax_11118.txt”}


我知道如何使用foreach制作,但我在想是否有更干净的方法。

如果您只想检查代码,那么:

files.Where(file => codes.Any(file.Contains));
如果是ax_代码:

files.Where(file => codes.Any(code => file.Contains($"ax_{code}")));

如果只想检查代码,则:

files.Where(file => codes.Any(file.Contains));
如果是ax_代码:

files.Where(file => codes.Any(code => file.Contains($"ax_{code}")));

使用StartsWith方法

var files = new List<string> { "ax_11118.txt", "ax_422226.txt", "ax_4346436.txt", "678678678.txt" };
var codes = new List<string> { "1111", "1234", "5555" };
files.Where(file => codes.Exists(code => file.StartsWith($"ax_{code}"))).ToList();
var files=新列表{“ax_11118.txt”、“ax_422226.txt”、“ax_4346436.txt”、“678678678.txt”};
var代码=新列表{“1111”、“1234”、“5555”};
files.Where(file=>codes.Exists(code=>file.StartsWith($“ax{code}”)).ToList();

使用StartsWith方法

var files = new List<string> { "ax_11118.txt", "ax_422226.txt", "ax_4346436.txt", "678678678.txt" };
var codes = new List<string> { "1111", "1234", "5555" };
files.Where(file => codes.Exists(code => file.StartsWith($"ax_{code}"))).ToList();
var files=新列表{“ax_11118.txt”、“ax_422226.txt”、“ax_4346436.txt”、“678678678.txt”};
var代码=新列表{“1111”、“1234”、“5555”};
files.Where(file=>codes.Exists(code=>file.StartsWith($“ax{code}”)).ToList();
您可以使用以下功能:

var result = files.Where(i => codes.Any(y => i.Contains(y)).ToList();
您可以使用以下选项:

var result = files.Where(i => codes.Any(y => i.Contains(y)).ToList();

另一个选项是使用联接和自定义EqualityComparer

var results = files.Join(codes, f=> f, c => c, (f,c) => f,new CustomEqualityComparer());
其中CustomEqualityComparer定义为

class CustomEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string left, string right)
    {
        return right.StartsWith($"ax_{left}");
    }

    public int GetHashCode(string str)
    {
        return 0;
    }
}
class CustomEqualityComparer:IEqualityComparer
{
公共布尔等于(字符串左、字符串右)
{
返回right.StartsWith($“ax_{left}”);
}
public int GetHashCode(字符串str)
{
返回0;
}
}

另一个选项是使用Join和自定义EqualityComparer

var results = files.Join(codes, f=> f, c => c, (f,c) => f,new CustomEqualityComparer());
其中CustomEqualityComparer定义为

class CustomEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string left, string right)
    {
        return right.StartsWith($"ax_{left}");
    }

    public int GetHashCode(string str)
    {
        return 0;
    }
}
class CustomEqualityComparer:IEqualityComparer
{
公共布尔等于(字符串左、字符串右)
{
返回right.StartsWith($“ax_{left}”);
}
public int GetHashCode(字符串str)
{
返回0;
}
}

StartWith是个好主意,它比我的解决方案更理想+1如果不是这种情况,请传递字符串。作为委托传递Contains函数是一种更漂亮的方法。StartWith是一个好主意,它比我的解决方案更理想+1如果不是这种情况,则将字符串.Contains函数作为委托传递是一种更漂亮的方法。