如何解决Value不能为null.参数名称:linq中的source?

mrh*_*nds 32 c# linq

我不知道为什么会出现这种错误.它有时会发生,我怀疑我关闭应用程序时仍然运行线程的代码.所以当我再次打开它时会发生.

Value cannot be null.
Parameter name: source
StackTree :
   at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate)
   at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.SettingValidationAndRange(List`1 listTextBox, List`1 listCheckBox, TabControl tabControl) in d:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_KVal.cs:line 430
   at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.vSen15_K_Loaded(Object sender, RoutedEventArgs e) in d:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_KVal.cs:line 846
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   at System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject root, RoutedEvent routedEvent)
   at System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root)
   at MS.Internal.LoadedOrUnloadedOperation.DoWork()
   at System.Windows.Media.MediaContext.FireLoadedPendingCallbacks()
   at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
   at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
   at System.Windows.Interop.HwndTarget.OnResize()
   at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wpa`
Run Code Online (Sandbox Code Playgroud)

我的代码在这里

    private void SettingValidationAndRange(List<TextBox> listTextBox, List<CheckBox> listCheckBox, TabControl tabControl)
        {

            List<string> listNotDeclare = new List<string>();

            foreach (var textB in listTextBox)
            {
                if (textB.Tag != null)
                    break;

                Metadata metadata = ListMetadataKor.Where(
                    x => "text" + x.Field == textB.Name // this line 430

                ).FirstOrDefault();

                if (metadata == null)
                {
                    if (!string.IsNullOrEmpty(textB.Name))
                        listNotDeclare.Add(textB.Name);
                }
                else
                {
                    metadata.TabControl = tabControl;
                    textB.Tag = metadata;
                }

                textB.AddEvents();
                textB.AutomateFocus();

            }

            if (listNotDeclare.Count > 0)
            {
                Clipboard.SetText(string.Join(",", listNotDeclare.ToArray()));
                Dialog.Info("Ada beberapa Metadata tidak ditemukan data sudah dicopy ke clipboard");
            }

        }
Run Code Online (Sandbox Code Playgroud)

当我第一次启动我的应用程序时,它不会出现任何错误.它发生在我打开第二或更多时.如果我打开我的应用程序,它将卡在该代码中.

我怎么能解决这个问题?我很确定我的财产ListMetadataKor不是null

ListMetadataKor是List<Metadata>我创建的对象的实例.它只在极少数情况下发生.我不知道要解决它

UPDATE

这是我的图像代码在此输入图像描述

我填写ListMetadataKor这段代码

BWHelper.Run((s, e) =>
{
    DataTable dataMetaDataKOR = ExcelHelper.GetDataTableFromExcel(
        AppConstants.FILE_METADATA, AppConstants.SHEET_METADATA_KOR
    );

    DataTable dataKonsistensiKOR = ExcelHelper.GetDataTableFromExcel(
         AppConstants.FILE_METADATA, AppConstants.SHEET_KONSISTENSI_KOR
     );

    listKonsistensiKor = Tools.ToolConvert.GetKonsistensi(dataKonsistensiKOR);
    listMetadataKor = Tools.ToolConvert.GetMetadata(dataMetaDataKOR);

    foreach (Metadata metadata in listMetadataKor)
    {
        metadata.Range.ProsesRange();
    }

}, (s, e) =>
{
    try
    {
        kor = new VSEN15_K() { Title = "Validasi Susenas - KOR" };
        kor.DataContext = new VMVsen15_KVal(rtSusenas.MasterRT, kor, this, listKonsistensiKor, listMetadataKor);
        kor.PreviewKeyDown += EventsCollection.EnterAsTabPreviewKeyDown;
        vmHome.HideLoading();
        UpdateMetaDataEntriKOR(RTSusenas.MasterRT);
        kor.ShowDialog();
    }
    catch (Exception Ex)
    {
        vmHome.HideLoading();
        Dialog.Error(Ex);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后我通过我的类的构造函数抛出变量

 public VMVsen15_KVal(
        MasterRT masterRT,
        VSEN15_K vSen15_K,
        IDaftarSusenas vmDaftarRTSusenas,
        List<Konsistensi> listKonsistensiKor,
        List<Metadata> listMetadataKor

        )
    {

        ListArtDetail = new ObservableCollection<ARTDetailVal>();

        this.ListKonsistensiKor = listKonsistensiKor;
        this.ListMetadataKor = listMetadataKor;
Run Code Online (Sandbox Code Playgroud)

我的工具konsistensi喜欢这个

public static List<Konsistensi> GetKonsistensi(DataTable dataTable)
{
    List<Konsistensi> listMetadata = new List<Konsistensi>();
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        Konsistensi k = new Konsistensi();
        object[] required = new object[] { DBNull.Value, "" };
        k.Field = dataTable.Rows[i][FIELD].ToString();
        if (string.IsNullOrWhiteSpace(k.Field)) continue;
        k.Message = dataTable.Rows[i][MESSAGE].ToString();
        var obj = dataTable.Rows[i][ORDER];
        k.Order = !required.Contains(dataTable.Rows[i][ORDER]) ? Convert.ToInt32(dataTable.Rows[i][ORDER]) : (int?)null;
        k.Page = !required.Contains(dataTable.Rows[i][PAGE]) ? Convert.ToInt32(dataTable.Rows[i][PAGE]) : (int?)null;
        k.Perlakuan = dataTable.Rows[i][PERLAKUAN].ToString();
        k.RelFields = dataTable.Rows[i][RELFIELDS].ToString();
        k.Rule = dataTable.Rows[i][RULE].ToString();

        if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("ART"))
            k.LevelKonsistensi = LevelKonsistensi.ART;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("RT"))
            k.LevelKonsistensi = LevelKonsistensi.RT;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("RTWARNING"))
            k.LevelKonsistensi = LevelKonsistensi.RTWarning;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper().Contains("ARTWARNING"))
            k.LevelKonsistensi = LevelKonsistensi.ARTWarning;
        else
            k.LevelKonsistensi = LevelKonsistensi.Lain;

        //k.LevelKonsistensi = dataTable.Rows[i][LEVEL].ToString().Contains("ART") ? LevelKonsistensi.ART : LevelKonsistensi.RT;
        if (k.IsEmpty())
            continue;

        listMetadata.Add(k);
    }
    return listMetadata;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 42

错误信息清楚地表明该source参数是null.Source是您枚举的可枚举数.在你的情况下,它是ListMetadataKor对象.它绝对null是你第二次过滤它的时候.确保您永远不会分配null到此列表.只需检查代码中对此列表的所有引用,然后查找分配.


Jen*_*iya 9

值不能为空.参数名称:source

当您查询null的集合时,会出现上述错误.

如下所示,代码将导致此类异常.

Console.WriteLine("Hello World");
IEnumerable<int> list = null;
list.Where(d => d ==4).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

这是上面代码的输出.

Hello World运行时异常(第11行):值不能为null.参数名称:source

堆栈跟踪:

[System.ArgumentNullException:Value不能为null.Program.Main()的参数名称:source]:第11行

在你的情况下ListMetadataKor是null. 如果你想玩,就是小提琴.


sam*_*son 6

当您调用这样的Linq语句时:

// x = new List<string>();
var count = x.Count(s => s.StartsWith("x"));
Run Code Online (Sandbox Code Playgroud)

您实际上是在System.Linq命名空间中使用扩展方法,因此编译器将其转换为:

var count = Enumerable.Count(x, s => s.StartsWith("x"));
Run Code Online (Sandbox Code Playgroud)

因此,您获得的错误是因为第一个参数source(将x在上面的示例中)为null.