Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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# 对不同分支标准LINQ的操作_C#_.net_Linq - Fatal编程技术网

C# 对不同分支标准LINQ的操作

C# 对不同分支标准LINQ的操作,c#,.net,linq,C#,.net,Linq,我想知道,是否有一种有效的方法可以使用LINQ在集合中实现分支逻辑,而无需多次迭代集合 比如说 foreach (string file in Files){ if (file== "file1"){ \\do something } else if (file== "file2") \\do something } else if (file== "file3") \\do s

我想知道,是否有一种有效的方法可以使用LINQ在集合中实现分支逻辑,而无需多次迭代集合

比如说

    foreach (string file in Files){

      if (file== "file1"){
        \\do something
      }
      else if (file== "file2")
        \\do something
      }
      else if (file== "file3")
        \\do something
      }
    }

我已经找到了一个使用查找的解决方案,但只适用于if-else情况

var group = Files.ToLookup(f => f=="file1");

var file1Group= group[true].ToList();

提前谢谢。

这有帮助吗?基本上,您可以投影一个新的匿名类型,其中包含您想要按、按顺序、按分组或其他方式进行筛选的额外属性

using System;
using System.Linq;

namespace Test
{
    public class Program
    {
        static void Main(string[] args)
        {
            var Files = new string[] { "file1", "file2" };

            var withMetaData = Files.Select(z =>
                new { file = z, IsFile1 = z == "file1", IsFile2 = z == "file2"});

            // You can now OrderBy or GroupBy or whatever you fancy here

            foreach (var fileWithMetaData in withMetaData)
            {
                Console.WriteLine(fileWithMetaData);
            }

            Console.ReadLine();
        }
    }
}

如果我有大量重复发生的动作,这些动作是在循环之前定义的,并且必须是可重用的(否则,您已经拥有的If…else可能更可取),我倾向于在字典(或其他集合)中引用这些动作。对于这个特定的示例(文件),只有当使用相同的文件名处理多个文件夹,或者从子字符串中获取“filex”部分时,这才有意义,但是这个概念可以应用于任何重复出现的分支逻辑

下面的示例使用lambdas,但是可以使用具有相同签名的任何现有方法

var actions = new Dictionary<string,Action>{
    {"file1", () => Console.WriteLine("abc")},
    {"file2", () => {var foo ="def"; Console.WriteLine(foo);}},
};

//example call, only to show usage
foreach(var file in new[]{"file1","file1","file2","file1"})
    actions[file](); //nb, for the example no check was added. For real use 'TryGetValue' can be used
var actions=新字典{
{“file1”,()=>Console.WriteLine(“abc”)},
{“file2”,()=>{var foo=“def”;Console.WriteLine(foo);},
};
//示例调用,仅显示用法
foreach(新[]{“file1”、“file1”、“file2”、“file1”}中的var文件)
动作[文件]()//注意,例如,未添加检查。对于实际使用,可以使用“TryGetValue”
当然,这是假设必须对每个文件执行操作,否则可以使用GROUPBY

由于每个文件都使用了一个操作,因此示例本身没有多大意义,因为没有针对单个文件的特定操作。因此,为了创造一个更合理的例子:

var actions = new Dictionary<string,Action<string>>{
    {"file1", f => Console.WriteLine("abc: {0}", f)},
    {"file2", f => {var foo ="def"; Console.WriteLine(foo);}},
};

foreach(var file in new[]{@"c:\temp\file1",@"c:\someotherfolder\file1",@"c:\temp\file2",@"c:\abc\file1"})
    actions[Path.GetFileNameWithoutExtension(file)](file); //nb, for the example no check was added. For real use 'TryGetValue' can be used
var actions=新字典{
{“file1”,f=>Console.WriteLine(“abc:{0}”,f)},
{“file2”,f=>{var foo=“def”;Console.WriteLine(foo);},
};
foreach(新[]{@“c:\temp\file1”、@“c:\someotherfolder\file1”、@“c:\temp\file2”、@“c:\abc\file1”}中的var文件)
操作[Path.GetFileNameWithoutExtension(文件)](文件)//注意,例如,未添加检查。对于实际使用,可以使用“TryGetValue”

既然你已经找到了一个解决方案,而且它是有效的,那么…你的问题是什么?“但只适用于if-else情况”看起来没有太大的局限性,考虑到问题中唯一的用例是if-else。我不认为你的“解决方案”(第二个代码片段)比第一个更好,我也不知道第一个在任务中是如何失败的。我可能是新来的堆栈溢出,没有正确地表达我自己。该代码段只是一个示例,我想知道如何使用LINQ在集合(例如字符串集合)中基于条件逻辑执行操作。在我看来,分组方法似乎不太理想,因为我将集合循环一次以将其拆分为组,并为每个组执行一个操作group@DimitrisM这不会重复源序列一次以上。谢谢@Me.Name,我喜欢这种在字典中执行操作的方法。。可能对DimitrisM有用