C# C如何从列表中提取包含x号的号码?

C# C如何从列表中提取包含x号的号码?,c#,list,C#,List,我想制作一个新的列表,其中包括Allnumber列表中的3个。 它应该包含所有有33、13、23、33、34、36、39、43、53…的数字。。。。 不管怎样,只接3个? 我发现有Findall,Contain方法,但不能用于int类型列表。谢谢大家都不敢相信有这么多的方法可以做到这一点 我发现有Findall,Contain方法,但不能用于int类型列表 这些是字符串方法,可以使用,您只需将数字转换为字符串作为where子句的一部分 但这远不是解决这一问题的最有效方法。对于小列表,它的性能很好

我想制作一个新的列表,其中包括Allnumber列表中的3个。 它应该包含所有有33、13、23、33、34、36、39、43、53…的数字。。。。 不管怎样,只接3个?
我发现有Findall,Contain方法,但不能用于int类型列表。谢谢大家都不敢相信有这么多的方法可以做到这一点

我发现有Findall,Contain方法,但不能用于int类型列表

这些是字符串方法,可以使用,您只需将数字转换为字符串作为where子句的一部分

但这远不是解决这一问题的最有效方法。对于小列表,它的性能很好,但随着列表长度的增加,它会逐渐变慢


要获得更有效的解决方案,请查看其中一个不将数字转换为字符串的答案。

您只需检查余数除以10后是否为3,即n%10==3

 List<int> HasThrees = (from number in Allnumber where number.ToString().Contains("3") select number).ToList();

这个解决方案基于OP所包含的示例,在阅读了一篇评论后,我意识到问题是否与所有3有关,比如31,32。那么字符串操作可能就是解决方案。

我将把这个签入移到一个单独的方法中

IEnumerable<int> allThrees =
    from num in Allnumber
    where num%10 == 3
    select num;
用法:

public static bool ContainsDigit(int input, int digit)
{
    do
    {
        if (input % 10 == digit)
        {
            return true;
        }
        input /= 10;
    }
    while (input > 0);
    return false;
}

dotnetfiddle并不能真正与benachmarking一起工作-它每次运行都会有一些变化,可能是因为dotnetfiddle的负载,我只能使用100000而不是1000000个数字,但是

首先使用ToString将Where子句中的所有数字转换为字符串,然后使用Contains获取包含数字3的所有数字的列表:

|------------------------------------------------------|
| User       | Method                   | Time         |
|------------|--------------------------+--------------|
| fubo       | ContainsDigit()          | 0,03 seconds |
| JamieC     | ToString().Contains("3") | 0,20 seconds |
| TheGeneral | WhereDigit()             | 0,10 seconds |
| TheGeneral | InternalRun()            | 0,04 seconds |
|------------------------------------------------------|
为了好玩,这里有一个yield版本和IEnumerable扩展方法

var result = Allnumber.Where(x => x.ToString().Contains("3")).ToList();
这里还有两个

var result = Allnumber.WhereDigit(3);

关于你的问题有一点不清楚。你是说包含3个还是以3结尾?即,找到32了吗?噢,是的,@Jamiec的评论改变了游戏:如果32在你的输出列表中,那么答案将不同,需要字符串处理。我的蜘蛛感觉告诉我这里的输入并不像它们应该的那样简洁。你知道,大家都不相信有这么多方法可以做到这一点:D@JungminKoo你很好地改变了现状接受答案。是的,我刚刚注意到了!很好的解决方案,我也考虑过把它贴出来!在31,32,34,35,36,37,38,39时失败,这就是答案@fubo中提到的。参见OP中给出的示例。支持我回答中的观点,即随着列表的增加,我的速度会逐渐变慢。10万人看不见,但100万人看得很清楚。孩子们,不要操纵绳子!哈哈,是的,我看到了。当数字来自超慢的数据库查询,然后您尝试优化此算法以从中挤出0.001s。有趣。如果你觉得无聊,我只添加了另外两个版本,如果你喜欢基准测试的话。我仍然不认为他们比你快。哈,凯尔,如果我们需要找工作来找到数字3,我们已经找到了。这一切都很好,不安全,不会在.net小提琴上运行,只是稍微快一点。但当我下班回家时,这只是一点乐趣,现在是喝啤酒的时候了
|------------------------------------------------------|
| User       | Method                   | Time         |
|------------|--------------------------+--------------|
| fubo       | ContainsDigit()          | 0,03 seconds |
| JamieC     | ToString().Contains("3") | 0,20 seconds |
| TheGeneral | WhereDigit()             | 0,10 seconds |
| TheGeneral | InternalRun()            | 0,04 seconds |
|------------------------------------------------------|
var result = Allnumber.Where(x => x.ToString().Contains("3")).ToList();
public static class StupidExtensions
{
    public static IEnumerable<int> Digits(int input)
    {
        do yield return input % 10; while ((input /= 10) > 0);
    }

    public static IEnumerable<int> WhereDigit(this IEnumerable<int> source, int digit) 
              => source.Where(x => Digits(x).Contains(digit));
}
var result = Allnumber.WhereDigit(3);
protected override IEnumerable<int> InternalRun(IEnumerable<int> values, int digit)
{
   var ary = values.ToArray();
   var result = new List<int>();
   fixed (int* pAry = ary)
   {
      for (var p = pAry; p < pAry + ary.Length; p++)
         for (var d = *p; d > 0; d /= 10)
            if (d % 10 == digit){ result.Add(*p); break;}
   }  
}

protected override IEnumerable<int> InternalRun(IEnumerable<int> values, int digit)
{
   foreach (var val in values)
      for (var d = val; d > 0; d /= 10)
         if (d % 10 == digit)
            yield return val;
}