C# 将值从列表分配到列表(不包括空值)
对不起,这个标题,但我不知道其他的提问方式 编辑以便于解释C# 将值从列表分配到列表(不包括空值),c#,C#,对不起,这个标题,但我不知道其他的提问方式 编辑以便于解释 public Dictionary<string, string>[] getValuesDB(DataSet ds) { Dictionary<string, string>[] info; Dictionary<string, string>[] temp = new Dictionary<string, string>[ds.Tables[
public Dictionary<string, string>[] getValuesDB(DataSet ds)
{
Dictionary<string, string>[] info;
Dictionary<string, string>[] temp = new Dictionary<string, string>[ds.Tables[0].Rows.Count];
Dictionary<string, string> d;
string ciclo = "CICLO 02";
try
{
for (int c = 0; c < ds.Tables[0].Rows.Count; c++)
{
d = new Dictionary<string, string>();
OracleConn ora = OracleConn.getInstancia();
DataSet oraDs = ora.getClientByCycle(ds.Tables[0].Columns["IDCliente"].Table.Rows[c].ItemArray[1].ToString(), ciclo);
if (oraDs.Tables[0].Rows.Count > 0)
{
oraDs.Tables[0].Columns[5].Table.Rows[0].ToString();
d.Add("DomID", ds.Tables[0].Columns["DomID"].Table.Rows[c].ItemArray[0].ToString());
d.Add("ClientID", ds.Tables[0].Columns["ClientID"].Table.Rows[c].ItemArray[1].ToString());
d.Add("AccountType", ds.Tables[0].Columns["AccountType"].Table.Rows[c].ItemArray[2].ToString());
temp[c] = d;
}
}
}
catch (Exception eo)
{
}
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
if (temp[i] != null)
count++;
}
info = new Dictionary<string, string>[count];
return info;
现在我需要从“temp”中获取所有非空值,并将其放入info中
有什么想法吗?试试这个
Dictionary<string, string> dictionaryWithoutNulls ;
dictionaryWithoutNulls = dictionaryWithNulls
.Where(d => d.Value != null)
.ToDictionary(s=>s.Key, s=>s.Value);
试试这个
Dictionary<string, string> dictionaryWithoutNulls ;
dictionaryWithoutNulls = dictionaryWithNulls
.Where(d => d.Value != null)
.ToDictionary(s=>s.Key, s=>s.Value);
简单回答
一个简单、直接、不美观的答案,适用于.NET 2.0,并尽可能少地干扰代码:
// ...code
info = new Dictionary<string, string>[count];
// Beginning of new code
int j = 0;
foreach (Dictionary<string, string> fromTemp in temp)
{
if (fromTemp == null)
continue;
info[j] = fromTemp;
j++;
}
// End of new code
return info;
然后返回值可能类似于IList
2.在循环中查询数据库
我猜ora.getClientByCycle。。。是一个数据库查询。几乎总是可以一起重写查询或批处理查询,这样只需对数据库进行一次往返。即使它是一个快速查询,它仍然可能是这个方法中最慢的一行。查询数据库一次,而不是ds.Tables[0].Rows.Count times
3.吞咽系统。异常
如果数据库查询在某些情况下可能失败,并且您对此没有意见,那么捕获OracleException。始终捕获最具体的异常。否则catch块可能会捕获并忽略您不期望的其他异常。那么你的程序就不能正常运行,你也没有有用的异常信息来帮助你调试它。有关更多信息,请参阅。简单答案
一个简单、直接、不美观的答案,适用于.NET 2.0,并尽可能少地干扰代码:
// ...code
info = new Dictionary<string, string>[count];
// Beginning of new code
int j = 0;
foreach (Dictionary<string, string> fromTemp in temp)
{
if (fromTemp == null)
continue;
info[j] = fromTemp;
j++;
}
// End of new code
return info;
然后返回值可能类似于IList
2.在循环中查询数据库
我猜ora.getClientByCycle。。。是一个数据库查询。几乎总是可以一起重写查询或批处理查询,这样只需对数据库进行一次往返。即使它是一个快速查询,它仍然可能是这个方法中最慢的一行。查询数据库一次,而不是ds.Tables[0].Rows.Count times
3.吞咽系统。异常
如果数据库查询在某些情况下可能失败,并且您对此没有意见,那么捕获OracleException。始终捕获最具体的异常。否则catch块可能会捕获并忽略您不期望的其他异常。那么你的程序就不能正常运行,你也没有有用的异常信息来帮助你调试它。有关更多信息,请参阅。我不确定您的确切要求。您想要一个所有键都具有非空值的新字典吗?不清楚您使用的是什么数据结构。你能发布声明它们的代码吗?你说你有两个字典,但是你的代码显示temp可以用int来索引。请澄清一下。初始化字典的大小不是强制性的,比如数组。另外,当您有LINQ可用时,您不必做所有这些,您有一系列字典,这几乎肯定不是您想要的。你可能想要一本分类词典或者仅仅是一本词典,这取决于顺序是否重要。我不确定你到底在问什么。您想要一个所有键都具有非空值的新字典吗?不清楚您使用的是什么数据结构。你能发布声明它们的代码吗?你说你有两个字典,但是你的代码显示temp可以用int来索引。请澄清一下。初始化字典的大小不是强制性的,比如数组。另外,当您有LINQ可用时,您不必做所有这些,您有一系列字典,这几乎肯定不是您想要的。你可能想要一本SortedDictionary或者仅仅是一本字典,这取决于顺序是否重要。因为它不是为2.0Lol设计的。是否会逐个提取每个非空值?还是我需要一个柜台?@GutierrezDev:你不需要柜台伙伴。dictionaryWithoutNulls只保存旧字典中的keyValuePair,根据您的问题状态,旧字典中的值不为null!!!尝试上述示例,然后尝试此字典,但不使用nulls.Keys.Count;和dictionaryWithoutNulls.Values.Count;因为它不是为2.0Lol设计的。是否会逐个提取每个非空值?还是我需要一个柜台?@GutierrezDev:你不需要柜台伙伴。dictionaryWithoutNulls只保存旧字典中的keyValuePair,根据您的问题状态,旧字典中的值不为null!!!尝试上述示例,然后尝试此字典,但不使用nulls.Keys.Count;和dictionaryWithoutNulls.Values.Count;哇!谢谢这个简单的答案很有效。2-在循环中查询数据库:我知道这可能是最慢的方法,但现在是最快的方法,因为时间太长了。这个项目不是由我开发的,所以我会暂时改变或修复一些东西。3-System.Exception:这是为了简洁,所以我将添加其各自的catch块。再次感谢。哇。谢谢这个简单的答案很有效。2-在循环中查询数据库:我知道这可能是最慢的方法,但现在是最快的方法,因为时间太长了。这个项目不是由我开发的,所以我会暂时改变或修复一些东西。3-System.Ex 异常:这是为了简洁,所以我将添加其各自的catch块。再次感谢。