索引超出了lambda表达式linq中数组的范围

时间:2018-05-20 09:18:32

标签: c# .net linq

如何检查数组在.net中是否至少有两个计数,我得到的索引超出了以下行数组的界限

var resValues = sites.ToDictionary(x => x.Split(',')[2].Replace("test=", ""), 
       x => GetTestCodeename(x.Split(',')[2].Replace("test=", ""), 
          GetTestCode(x.Split(',')[2].Replace("test=", "").Split('_')[1])));

其中resValues的计数为1200,所以我想不到存储在某个变量中..我想在单个Linq代码中为所有这些1200值做

4 个答案:

答案 0 :(得分:1)

你在这里和那里放了一些支票: - )

global $wpdb; $known_value = 1837;
  $sql = $wpdb->prepare( "SELECT fix_against FROM fixtures WHERE fix_id = '$known_value'");
$result = $wpdb->get_results( $sql );echo $result;

注意使用关键字var resValues = (from x in sites let sp1 = x.Split(',') where sp1.Length > 2 let rep = sp1[2].Replace("test=", "") let sp2 = rep.Split('_') where sp2.Length > 1 select new { Key = rep, Value = GetTestCodeename(rep, GetTestCode(sp2[1])) }).ToDictionary(x => x.Key, x => x.Value); 在LINQ表达式中创建变量,然后创建一个包含letKey的新临时匿名对象,然后创建从这个对象开始的Value

我正在跳过所有无法通过两个Dictionary<,>完全拆分的元素。

答案 1 :(得分:1)

一些修改应该可以帮助您避免索引超出范围异常:

var result = sites.Select(s => s.Split(','))
                  .Where(s => s.Length > 2)
                  .Select(s => s[2].Replace("test=", ""))
                  .ToDictionary(s => s,
                        s => GetTestCodeename(s,
                                 GetTestCode(s.IndexOf('_') != -1 ?
                                        s.Split('_')[1] : string.Empty)));  

或者如果您不希望在s.IndexOf('_') != -1返回false的情况下传递空字符串,那么您可以采用这种方法:

var result = sites.Select(s => s.Split(','))
                  .Where(s => s.Length > 2)
                  .Select(s => s[2].Replace("test=", ""))
                  .Where(s => s.IndexOf('_') != -1)
                  .ToDictionary(s => s,
                        s => GetTestCodeename(s,
                             GetTestCode(s.Split('_')[1]))); 

答案 2 :(得分:1)

<meta-data
    android:name="com.google.android.gms.vision.DEPENDENCIES"
    android:value="face" />

答案 3 :(得分:1)

为了避免出现超出范围的异常和空值,您可以使用SelectMany采用monadic方法。这里没有空值,你将有一个空序列,任何返回枚举的LINQ函数都可以工作,而不会抛出异常,只传播这个空序列。 SkipTake也不会检查长度,并且在集合太短的情况下返回空的可枚举或子序列。

var resValues = sites
    .Where(s => s != null)
    .SelectMany(s => s
        .Split(',')
        .Skip(2)
        .Take(1) 
        .Select(a => a.Replace("test=", ""))
        .SelectMany(a => a
            .Split('_')
            .Skip(1)
            .Take(1)
            .Select(b => new
            {
                TestCodeName = GetTestCodeName(a),
                TestCode = GetTestCode(a, b)
            })))
    .ToDictionary(p => p.TestCodeName, p => p.TestCode);

请注意,这会忽略在示例中无法取值Split(',')[2]Split('_')[1]的所有网站。